先看乙個多執行緒間共享資料的問題:
設計四個執行緒,其中兩個執行緒每次對data增加1,另外兩個執行緒每次對data減少1。從問題來看,很明顯涉及到了執行緒間通資料的共享,四個執行緒共享乙個data,共同操作乙個data。我們先把上面這個問題放在一邊,慢慢分析多個執行緒之間共享資料的一些情況,從最簡單開始,分類分析完了後,到時候也好解決上面這個問題了。
這是最簡單的一種情況,比如賣票,幾個執行緒共同操作記錄票數的那個變數,任務都是使它減一。針對這種情況,我們只需要寫乙個類實現runnable介面即可,在run()方法中對這個票進行減一,然後將這個runnalbe扔給多個執行緒去執行,自然它們就操作同乙個data了。看一下**:
public
class
multithreadsharedata
}}class sharedata implements runnable
}// }
}}
這很好理解,也很容易實現,四個執行緒賣了4張票。執行結果為:
thread-0: 100thread-3: 99
thread-2: 98
thread-1: 97
就如上面那個題目所描述的,兩個執行緒執行data增,兩個執行緒執行data減。針對這種情況,我們要實現兩個runnable了,因為很明顯有兩個不同的任務了,乙個任務執行data增,另乙個任務執行data減。為了便於維護,可以將兩個任務方法放到乙個類中,然後將data也放在這個類中,然後傳到不同的runnable中,即可完成資料的共享。如下:
public
class
multithreadsharedata
}).start();
}for(int i = 0; i < 2; i ++)
}).start();
}
}}
class sharedata /*implements runnable*/
public
synchronized
void
decrement()
}
看一下列印結果:
thread-0: before : 0這樣寫的好處是兩個任務方法可以直接在方法名上進行同步操作,這種模式的好處在前面的博文中已經有說過了,封裝的好。thread-0: after : 1
thread-1: before : 1
thread-1: after : 2
thread-2: before : 2
thread-2: after : 1
thread-3: before : 1
thread-3: after : 0
最後總結一下,多個執行緒之間共享資料主要關注兩點就行:一是什麼任務?幾個任務?二是幾個執行緒?記住 一點:幾個任務和幾個執行緒是沒有關係的!100個執行緒可以執行乙個任務,也可以執行2個任務,3個任務……
如果只有乙個任務,那說明多個執行緒執行乙個任務,我們只要實現乙個runnable介面,把公共data放進runnable,把任務放進去run()中即可(任務注意要同步),然後開啟n個執行緒去執行這個任務即可;如果有m個任務,那我們新建乙個專門執行任務的類,把公共的data放進類中,把任務作為類中的同步方法即可,然後開啟n個執行緒,每個執行緒中扔乙個runnable,按照要求執行任務類中的方法即可。
到這裡,終於能體會到任務和執行緒的分離了,這種思想也算是物件導向的一種吧,之前學習的時候沒啥感覺,現在越總結感覺思路越清晰。
多個執行緒間如何共享資料?
如果每個縣城執行的 相同,可以使用同乙個runnable物件,這個runnable物件中有那個共享資料。將共享資料封裝成另乙個物件,然後將這個物件逐一傳遞給各個runnable物件,每個執行緒對共享資料的操作方法也分配到那個物件身上,這樣容易實現針對資料進行各個操作的互斥和通訊。將runnable物...
JAVA 併發程式設計 多個執行緒之間共享資料(六)
1。假設每乙個執行緒執行的 同樣。能夠使用同乙個 runnable 物件,這個 runnable 物件中有那個共享資料,比如,賣票系統就能夠這麼做。2,假設每乙個執行緒執行的 不同。這時候須要用不同的 runnable 物件,比如,設計4個執行緒。當中兩個執行緒每次對j新增1。另外兩個執行緒對j每次...
併發程式設計 3 執行緒間共享資料
一 共享記憶體帶來的問題 讀時沒問題,寫時會有競爭問題。二 解決方法 1 最簡單的辦法就是對資料結構採用某種保護機制,確保只有進行修改的執行緒才能看到不變數被破壞時的中間狀態。從其他訪問執行緒的角度來看,修改不是已經完成了,就是還沒開始。2 另乙個選擇是對資料結構和不變數的設計進行修改,修改完的結構...