Runnable类使用方法+与Thread区别
2017-07-30 22:14
330 查看
1、Runnable类使用
方法1
class Bank{ private int sum; public void add(int n) { sum += n; System.out.println("sum = " + sum); } } class Cus1 implements Runnable{ private Bank b = new Bank(); public void run(){ // 无锁状态会读脏数据 for( int x = 0; x < 5; x++ ){ b.add(1000); } } } class Cus2 implements Runnable{ private Bank b = new Bank(); public void run(){ synchronized(b){ // 加锁 for( int x = 0; x < 5; x++ ){ b.add(100); } } } } public class Main{ public static void main(String []args){ //Cus1 c = new Cus1(); Cus2 c = new Cus2(); // 两个线程执行c对象 Thread t1 = new Thread(c); Thread t2 = new Thread(c); t1.start(); t2.start(); } }
无锁状态下结果不稳定:
方法2
class Bank{ private int sum; public synchronized void add(int n){ sum += n; System.out.println("sum="+sum); } } class Cus implements Runnable{ private Bank b=new Bank(); public void run(){ for(int x=0;x<5;x++) { b.add(100); } } } public class Main{ public static void main(String []args){ Cus c=new Cus(); Thread t1=new Thread(c); Thread t2=new Thread(c); t1.start(); t2.start(); } }
加锁状态下顺序正确:
2、Thread与Runnable区别
1、该段代码结果为三个线程各卖5张票,没有共享5张票class MyThread extends Thread { private int ticket=5; public void run() { for(int i=0;i<20;i++) { if(this.ticket>0) { System.out.println("卖票:ticket"+this.ticket--); } } } } public class Main { public static void main(String[] args) { MyThread mt1=new MyThread(); MyThread mt2=new MyThread(); MyThread mt3=new MyThread(); mt1.start(); mt2.start(); mt3.start(); } }
2、三个线程共享5张票。
class MyThread implements Runnable { private int ticket=5; public void run() { for(int i=0;i<20;i++) { if(this.ticket>0) { System.out.println("卖票:ticket"+this.ticket--); } } } } public class Main { public static void main(String[] args) { MyThread mt=new MyThread(); new Thread(mt).start(); new Thread(mt).start(); new Thread(mt).start(); } }
相关文章推荐
- Java中两种多线程实现方法:Thread类和Runnable接口的联系与区别
- Runnable和Thread的使用简介与区别
- JAVA基础(多线程Thread和Runnable的使用区别
- Thread--01在线程池使用Callable和Runnable的区别以及如何关闭线程
- java之Runnable和Thread区别与实现方法
- 关于线程Thread类中的 Thread(Runnable target) 构造方法的使用
- Java多线程实现接口Runnable和继承Thread区别(建议使用Runnable)
- java之多线程中Thread类和Runnable接口使用方法
- Android 开发中的 Handler ,Thread ,Message ,Runnable 的综合使用方法
- Android开发笔记: Runnable,Handler ,Thread的使用方法
- Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别
- JAVA基础(多线程Thread和Runnable的使用区别(转载)
- 单线程实例区别Thread和Runnable方法
- Java初学习 - Thread和Runnable的使用区别
- java多线程Thread与Runnable的区别与使用深入理解
- 多线程实现方法之Thread和Runnable区别
- Java线程之两种方法Runnable和Thread的区别
- Android 开发中的 Handler ,Thread ,Message ,Runnable 的综合使用方法
- c# 中一些方法使用的区别
- 在ASP中,直接使用“Insert into” 语句与使用ADO中AddNew方法有什么区别?哪一种更好呢?