Java多線程編程之拜訪同享對象和數據的辦法。本站提示廣大學習愛好者:(Java多線程編程之拜訪同享對象和數據的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是Java多線程編程之拜訪同享對象和數據的辦法正文
多個線程拜訪同享對象和數據的方法有兩種情形:
1、每一個線程履行的代碼雷同,例如,賣票:多個窗口同時賣這100張票,這100張票須要多個線程同享。
2、每一個線程履行的代碼分歧,例如:設計四個線程,個中兩個線程每次對j增長1,別的兩個線程每次對j削減1。
a、假如每一個線程履行的代碼雷同,可使用統一個Runnable對象,這個對象中有同享數據。賣票便可以如許做,每一個窗口都在做賣票義務,賣的票都是統一個數據(點擊檢查詳細案例)。
b、假如每一個線程履行的代碼分歧,就須要應用分歧的Runnable對象,有兩種方法完成Runnable對象之間的數據同享:
1)、將同享數據零丁封裝到一個對象中,同時在對象中供給操作這些同享數據的辦法,可以便利完成對同享數據各項操作的互斥和通訊。
2、)將各個Runnable對象作為某個類的外部類,同享數據作為內部類的成員變量,對同享數據的操作辦法也在內部類中供給,以便完成互斥和通訊,外部類的Runnable對象挪用內部類中操作同享數據的辦法便可。
package com.ljq.test.thread;
/**
* 多個線程之間同享數據的方法
*
* 設計四個線程,個中兩個線程每次對j增長1,別的兩個線程每次對j削減1。輪回100次。
*
* @author Administrator
*
*/
public class MultiThreadShareData {
private static ShareData data1 = new ShareData();
public static void main(String[] args) {
ShareData data2 = new ShareData();
new Thread(new DecrementRunnable(data2)).start();
new Thread(new IncrementRunnable(data2)).start();
final ShareData data1 = new ShareData();
new Thread(new Runnable() {
@Override
public void run() {
data1.decrement();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
data1.increment();
}
}).start();
}
}
/**
* 創立線程類,擔任對j削減1
*
* @author Administrator
*
*/
class DecrementRunnable implements Runnable {
private ShareData data;
public DecrementRunnable(ShareData data) {
this.data = data;
}
public void run() {
for(int i=0; i<100; i++){
data.decrement();
}
}
}
/**
* 創立線程類,擔任對j增長1
*
* @author Administrator
*
*/
class IncrementRunnable implements Runnable {
private ShareData data;
public IncrementRunnable(ShareData data) {
this.data = data;
}
public void run() {
for(int i=0; i<100; i++){
data.increment();
}
}
}
/**
* 封裝同享數據
*
* @author Administrator
*
*/
class ShareData {
private int j = 0;
/**
* 每次對j增長1
*/
public synchronized void increment() {
j++;
System.out.println("j++="+j);
}
/**
* 每次對j削減1
*/
public synchronized void decrement() {
j--;
System.out.println("j--="+j);
}
}
留意:要同步互斥的幾段代碼最好分離放在幾個自力的辦法中,這些辦法再放在統一個類中,如許比擬輕易完成它們之間的同步互斥和通訊。