要實現多線程訪問共享對象,通常要將有互斥的代碼放在一個類當中。若是多線程中的每一個線程執行的代碼相同,能夠功用一個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; } }