要实现多线程访问共享对象,通常要将有互斥的代码放在一个类当中。若是多线程中的每一个线程执行的代码相同,能够功用一个Runable对象;若是很少线程代码不一致,则须要用多个Runable对象或者多个Runable实现类。java
可用一个Runable实现类来实现,以下:多线程
/** * 多线程访问共享对象和数据的方式 方式一:共享的代码是同样的 * * @author xiao * */ public class MultiThreadShareData1 { public static void main(String[] args) { // 对象共享 ShareData1 data1 = new ShareData1(); new Thread(data1).start(); new Thread(data1).start(); } } class ShareData1 implements Runnable { private int count = 100; @Override public void run() { while (count > 0) { count--; } } }
能够用多个Runable对象或者多个Runable实现类:ide
(1)用多个Runable对象,以下:this
/** * 多线程访问共享对象和数据的方式 * 方式二:共享的代码不同 * * @author xiao * */ public class MultiThreadShareData2 { public static void main(String[] args) { // 第一种方式:在各个线程的中共用一个对象,在各自的run()方法中执行共用对象的不一样代码 final ShareData2 data1 = new ShareData2(); new Thread(new Runnable() { @Override public void run() { data1.decrement(); } }).start(); new Thread(new Runnable() { @Override public void run() { data1.increment(); } }).start(); } } class ShareData2 { private int j = 0; public synchronized void increment() { j++; } public synchronized void decrement() { j--; } }
(2)使用多个Runable实现类,以下:spa
/** * 多线程访问共享对象和数据的方式 * 方式二:共享的代码不同 * * @author admin * */ public class MultiThreadShareData3 { public static void main(String[] args) { // 第二种方式:定义多个Runnable的实现类,而后再不一样的Runnable实现类中执行公用对象的不一样代码 ShareData3 data3 = new ShareData3(); new Thread(new MyRunnable1(data3)).start(); new Thread(new MyRunnable2(data3)).start(); } } class MyRunnable1 implements Runnable { private ShareData3 data3; public MyRunnable1(ShareData3 data3) { this.data3 = data3; } @Override public void run() { data3.decrement(); } } class MyRunnable2 implements Runnable { private ShareData3 data3; public MyRunnable2(ShareData3 data3) { this.data3 = data3; } @Override public void run() { data3.increment(); } } class ShareData3 { private int j = 0; public synchronized void increment() { setJ(getJ() + 1); } public synchronized void decrement() { setJ(getJ() - 1); } public int getJ() { return j; } public void setJ(int j) { this.j = j; } }