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();
}
}
總結:要同步互斥的程式碼任務最好將他們分別放在獨立的方法中,這些方法再放在同一個類中,這樣比較容易實現操作的同步和通訊。
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
相關文章
- Java 共享資料讀寫(多執行緒)Java執行緒
- Java多執行緒/併發05、synchronized應用例項:執行緒間操作共享資料Java執行緒synchronized
- Java 多執行緒共享模型之管程(上)Java執行緒模型
- Java多執行緒——執行緒Java執行緒
- 多執行緒之共享模型執行緒模型
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒——執行緒池Java執行緒
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- java——多執行緒Java執行緒
- java 多執行緒Java執行緒
- 【Java】多執行緒Java執行緒
- JAVA 多執行緒 ??Java執行緒
- java多執行緒Java執行緒
- Java - 多執行緒Java執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- java多執行緒9:執行緒池Java執行緒
- Java多執行緒之執行緒中止Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- Java多執行緒——守護執行緒Java執行緒
- Java多執行緒16:執行緒組Java執行緒
- Java多執行緒18:執行緒池Java執行緒
- openharmony 多執行緒的方式有哪些?兩個worker執行緒資料如何通訊、記憶體如何共享、與Java多執行緒有什麼區別?執行緒記憶體Java
- Java多執行緒學習(一)Java多執行緒入門Java執行緒
- Java多執行緒(一)多執行緒入門篇Java執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 【Java】【多執行緒】執行緒池簡述Java執行緒
- java多執行緒系列之執行緒池Java執行緒
- java資料——執行緒(轉)Java執行緒
- 多執行緒資料採集執行緒
- java 多執行緒 –同步Java執行緒
- java多執行緒原理Java執行緒
- java 多執行緒-3Java執行緒
- java 多執行緒-2Java執行緒
- Java多執行緒——SemaphoreJava執行緒