Java多個線程之間處理共用資料的方式,java線程
題目要求:
有4個線程,其中兩個線程每次對x加1,另外兩個每次對x減1,如何??
分析:
x就是這4個線程要處理的共用資料,不同種線程有不同的處理方式,但操作的資料是共同的,聯想到“視窗買票問題”,但是賣票只是單純的減。
所以,多個線程訪問共用對象或資料的方式,先看,如果每個線程執行的代碼相同,那麼就可以使用同一個Runnable對象,這個對象中有被共用的資料,如買票問題。
如果每個線程執行的代碼不同,肯定需要不用的Runnable對象,有兩種方式實現這些不同的Runnable對象之間的資料共用:
第一種:將共用資料封裝到一個對象中,把這個共用資料所在的對象傳遞給不同的Runnable,每個線程對共用資料的操作也分給那個
對象完成,這樣就可以實現對該資料處理的互斥與通訊。
class ShareData {private int x = 0;public synchronized void addx(){x++;System.out.println("x++ : "+x);}public synchronized void subx(){x--;System.out.println("x-- : "+x);}}class MyRunnable1 implements Runnable{private ShareData share1 = null;public MyRunnable1(ShareData share1) {this.share1 = share1;}public void run() {for(int i = 0;i<100;i++){share1.addx();}}}class MyRunnable2 implements Runnable{private ShareData share2 = null;public MyRunnable2(ShareData share2) {this.share2 = share2;}public void run() {for(int i = 0;i<100;i++){share2.subx();}}}public class ThreadsVisitData { public static void main(String[] args) {ShareData share = new ShareData();new Thread(new MyRunnable1(share)).start();new Thread(new MyRunnable2(share)).start();}}
第二種:
將這些Runnable對象作為某一個類的內部類,共用的資料作為外部類的成員變數,對共用資料的操作分配給外部類的方法來完成,以此實現對操作共用
資料的互斥和通訊,作為內部類的Runnable來操作外部類的方法,實現對資料的操作
class ShareData {private int x = 0;public synchronized void addx(){x++;System.out.println("x++ : "+x);}public synchronized void subx(){x--;System.out.println("x-- : "+x);}}public class ThreadsVisitData { public static ShareData share = new ShareData(); public static void main(String[] args) {//final ShareData share = new ShareData();new Thread(new Runnable() {public void run() {for(int i = 0;i<100;i++){share.addx();}}}).start();new Thread(new Runnable() {public void run() {for(int i = 0;i<100;i++){share.subx();}}}).start(); }}
總結:要同步互斥的代碼任務最好將他們分別放在獨立的方法中,這些方法再放在同一個類中,這樣比較容易實現操作的同步和通訊