多執行緒間共享資料,簡單Demo

2021-07-13 01:26:39 字數 1799 閱讀 8804

多執行緒間共享資料的問題:

設計四個執行緒,其中兩個執行緒每次對data增加1,另外兩個執行緒每次對data減少1。

從問題來看,很明顯涉及到了執行緒間通資料的共享,四個執行緒共享乙個data,共同操作乙個data。我們先把上面這個問題放在一邊,慢慢分析多個執行緒之間共享資料的一些情況,從最簡單開始,分類分析完了後,到時候也好解決上面這個問題了。

這是最簡單的一種情況,比如賣票,幾個執行緒共同操作記錄票數的那個變數,任務都是使它減一。針對這種情況,我們只需要寫乙個類實現runnable介面即可,在run()方法中對這個票進行減一,然後將這個runnalbe扔給多個執行緒去執行,自然它們就操作同乙個data了。看一下**:

package day01;

public class sharedata implements runnable

}//}}}

package day01;

public class multithreadsharedata }}

列印結果,10個執行緒賣了10張票:

thread-0:100

thread-1:99

thread-3:98

thread-4:97

thread-5:96

thread-6:95

thread-2:94

thread-8:93

thread-7:92

hread-9:91

就如上面那個題目所描述的,兩個執行緒執行data增,兩個執行緒執行data減。針對這種情況,我們要實現兩個runnable了,因為很明顯有兩個不同的任務了,乙個任務執行data增,另乙個任務執行data減。為了便於維護,可以將兩個任務方法放到乙個類中,然後將data也放在這個類中,然後傳到不同的runnable中,即可完成資料的共享。如下:

package day01;

public class sharedataother

public synchronized void deincrement()}

package day01;

public class multithreadsharedataother

}).start();

}for(int j = 0; j<2; j++)

}).start();}}

}列印結果:

thread-0:before:0

thread-0:after:1

thread-2:before:1

thread-2:after:0

thread-1:before:0

thread-1:after:1

thread-3:before:1

thread-3:after:0

這樣寫的好處是兩個任務方法可以直接在方法名上進行同步操作,這種模式的好處在前面的博文中已經有說過了,封裝的好。 

最後總結一下,多個執行緒之間共享資料主要關注兩點就行:一是什麼任務?幾個任務?二是幾個執行緒?記住 一點:幾個任務和幾個執行緒是沒有關係的!100個執行緒可以執行乙個任務,也可以執行2個任務,3個任務…… 

如果只有乙個任務,那說明多個執行緒執行乙個任務,我們只要實現乙個runnable介面,把公共data放進runnable,把任務放進去run()中即可(任務注意要同步),然後開啟n個執行緒去執行這個任務即可;如果有m個任務,那我們新建乙個專門執行任務的類,把公共的data放進類中,把任務作為類中的同步方法即可,然後開啟n個執行緒,每個執行緒中扔乙個runnable,按照要求執行任務類中的方法即可。 

到這裡,終於能體會到任務和執行緒的分離了,這種思想也算是物件導向的一種吧,之前學習的時候沒啥感覺,現在越總結感覺思路越清晰。

更多併發文章請閱讀:

C 多執行緒學習 執行緒間的共享資料

多執行緒間的共享資料如果不加以約束是有問題的。最簡單的方法就是對資料結構採用某種保護機制,通俗的表達就是 確保只有進行修改的執行緒才能看到不變數被破壞時的中間狀態。從其他訪問執行緒的角度來看,修改不是已經完成了,就是還沒開始。1.使用互斥量保護共享資料 當訪問共享資料前,使用互斥量將相關資料鎖住,再...

多執行緒間共享物件和資料方式

一 若每個執行緒執行的 相同,可以用同乙個runnable物件,runnable裡面有共享的物件和資料,例如賣票系統,5個執行緒共同賣100張票 public class threadtest2 class shareticket implements runnable 二 若每個執行緒執行的 不同...

執行緒間共享資料

首先給大家分享乙個巨牛巨牛的人工智慧教程,是我無意中發現的。教程不僅零基礎,通俗易懂,而且非常風趣幽默,還時不時有內涵段子,像看 一樣,哈哈 我正在學習中,覺得太牛了,所以分享給大家!點這裡可以跳轉到教程 一 每個執行緒執行的 相同 若每個執行緒執行的 相同,共享資料就比較方便。可以使用同乙個run...