歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java多個線程之間處理共享數據的方式

Java多個線程之間處理共享數據的方式

日期:2017/3/1 9:36:29   编辑:Linux編程

題目要求:

有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();
}
}

總結:要同步互斥的代碼任務最好將他們分別放在獨立的方法中,這些方法再放在同一個類中,這樣比較容易實現操作的同步和通信。

Java多線程從簡單到復雜 http://www.linuxidc.com/Linux/2014-07/104435.htm

Java多線程經典案例 http://www.linuxidc.com/Linux/2014-06/103458.htm

Java多線程:ReentrantReadWriteLock讀寫鎖的使用 http://www.linuxidc.com/Linux/2014-06/103457.htm

Java內存映射文件實現多線程下載 http://www.linuxidc.com/Linux/2014-05/102201.htm

Java多線程:一道阿裡面試題的分析與應對 http://www.linuxidc.com/Linux/2014-03/98715.htm

Java中兩種實現多線程方式的對比分析 http://www.linuxidc.com/Linux/2013-12/93690.htm

Copyright © Linux教程網 All Rights Reserved