實現執行緒共享資料的方式

2021-10-09 20:10:26 字數 2798 閱讀 4032

說明:這裡以new thread(runnable target)的方式建立執行緒。希望讀者首先了解靜態**以及執行緒的幾種建立方式。

思路:thread類使用new thread(runnable target)的方式建立執行緒物件時,使用的是靜態**的模式,執行緒執行時,最終會使用target.run()方法,因此想要實現資料的共享,只要保證run方法中的資料是與其它執行緒共享即可,我們知道run方法是是無參的,因此只能將共享資料放在target物件中,比如作為成員變數,方便run方法呼叫。這樣一來,保證target物件中的成員變數與其它執行緒使用的target物件共享即可。於是有了下面2個方式:

第一:使用同乙個target物件建立不同的執行緒物件。這種方式最簡單,因為不同執行緒最終使用的是同乙個target物件呼叫run方法,因此資料必然是共享的。但是它無法滿足一種情況,即:當不同執行緒使用不同的業務邏輯時。正因為使用同乙個target物件,所以它的run方法的業務邏輯必然是完全一樣的。

public

static

void

main

(string[

] args)}}

;//使用同乙個runnable物件建立執行緒物件

newthread

(runnable,

"a")

.start()

;new

thread

(runnable,

"b")

.start()

;new

thread

(runnable,

"c")

.start()

;}

結果:

b購買了第10張票

b購買了第7張票

b購買了第6張票

b購買了第5張票

a購買了第8張票

c購買了第9張票

a購買了第3張票

b購買了第4張票

a購買了第1張票

c購買了第2張票

第二:為了滿足不同執行緒不同的業務邏輯,必然需要使用不同的target作為建立執行緒的引數。可以將共享資料注入到不同的target物件中,這樣只要保證注入不同target物件的資料是共享的(同乙個物件),也可以保證run方法中的資料是共享的。

class

sharedata2

//共享物件

static

class

account

public

account()

public

intgetmoney()

public

void

setmoney

(int money)

@override

public string tostring()

}//執行緒類1

static

class

myrunnable

implements

runnable

//run方法

@override

public

void

run()}

//執行緒類2

static

class

myrunnable2

implements

runnable

//run方法的邏輯與上乙個不同

@override

public

void

run()}

}

結果:

轉入100,剩餘:account [money=

1100

]轉出100,剩餘:account [money=

1000

]

最後畫個圖幫助理解:

複習心得-------------------------------------------

先看**:

public

static

void

main

(string[

] args)

catch

(interruptedexception e)

system.out.

println

(thread.

currentthread()

.getname()

+":"

+--i);}

};//建立執行緒

newthread

(runnable,

"a")

.start()

;new

thread

(runnable,

"b")

.start()

;new

thread

(runnable,

"c")

.start()

;}

輸出:

a:9b:

9c:9a:

8b:8c:

8...省略c:0

a:0b:0

為什麼**這樣寫,沒有實現資料共享呢?原因是:我將共享資料(int i = 10)定義在了run方法內部,使其成為了區域性變數,而區域性變數儲存在棧中,是執行緒私有的,所以無法實現資料共享。這一點要注意,要實現執行緒之間的資料共享,必須要把資料儲存在堆中,也就是作為成員變數來定義。

多執行緒共享資料的方式

1,如果每個執行緒執行的 相同,可以使用同乙個runnable物件,這個runnable物件中有那個共享資料,例如,賣票系統就可以這麼做。2,如果每個執行緒執行的 不同,這時候需要用不同的runnable物件,例如,設計4個執行緒。其中兩個執行緒每次對j增加1,另外兩個執行緒對j每次減1,銀行訪問款...

java多執行緒實現資料共享

練習題 賣100個蘋果,實現資料共享。新建乙個執行緒有兩種方式 1.繼承thread類 2.是實現runnable的方式 那我們就先使用第一種方式來實現 第一步 存在資料共享 author liujun class sharethread extends thread catch interrupt...

Runnable方式實現執行緒可以共享資源的原因

執行緒的兩種實現方式,通過實現runnable介面的執行緒方式可以實現資源的共享,而繼承thread則不可以,原因何在?先看下面兩段 通過thread實現執行緒 使用thread實現執行緒不能實現資源共享 class mythread extends thread public void run p...