說明:這裡以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...