生產者消費者及交叉列印實現

2021-10-24 12:18:49 字數 2934 閱讀 6728

class

sharadata

num++

; system.out.

println

(thread.

currentthread()

.getname()

+"生產");

condition.

signalall()

;}catch

(interruptedexception e)

finally

}public

void

decrement()

num--

; system.out.

println

(thread.

currentthread()

.getname()

+"消費");

condition.

signalall()

;}catch

(interruptedexception e)

finally}}

public

class

main})

.start()

;new

thread((

)->})

.start()

;}}

class

sharedata

//生產者

public

void

product()

throws interruptedexception

else

thread.

sleep

(500);

}}//消費者

public

void

consume()

throws interruptedexception

else

thread.

sleep

(700);

}}//停止生產和消費

public

void

stop()

}

public

static

void

main

(string[

] args)

catch

(interruptedexception e)})

.start()

;new

thread((

)->

catch

(interruptedexception e)})

.start()

;try

catch

(interruptedexception e)

sharedata.

stop()

; system.out.

println

("停止生產和消費");

}

執行緒a列印123456…執行緒b列印abcdefg…交叉列印結果1a2b3c…

利用synchronized同步鎖加wait/notify實現

兩個細節:1、如何保證一定是第乙個執行緒先執行?使用countdownlatch

2、一定是先notify再wait,在for迴圈之後必須notify,否則程式不會結束,一定有乙個執行緒在等待喚醒

public

static

void

main

(string[

] args)

catch

(interruptedexception e)

} o.

notify()

;//列印結束後一定要喚醒另乙個執行緒}}

,"t1").

start()

;new

thread((

)->

catch

(interruptedexception e)

synchronized

(o)catch

(interruptedexception e)

} o.

notify()

;//列印結束後一定要喚醒另乙個執行緒}}

).start()

;}

利用locksupport實現

public

class

main})

; t2 =

newthread((

)->})

; t1.

start()

; t2.

start()

;}}

利用reentrantlock和condition實現。實現思路與synchronized一樣,只不過使用condition精確喚醒

public

static

void

main

(string[

] args)

condition2.

signal()

;//執行緒執行完畢後記得喚醒另乙個執行緒

}catch

(interruptedexception e)

finally})

.start()

;new

thread((

)->

condition1.

signal()

;}catch

(interruptedexception e)

finally})

.start()

;}

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...

生產者消費者

using system using system.collections.generic using system.threading namespace gmservice foreach thread thread in producers q.exit console.read public...

生產者消費者

執行緒通訊 乙個執行緒完成了自己的任務時,要通知另外乙個執行緒去完成另外乙個任務.wait 等待 如果執行緒執行了wait方法,那麼該執行緒會進入等待的狀態,等待狀態下的執行緒必須要被其他執行緒呼叫notify方法才能喚醒。notify 喚醒 喚醒執行緒池等待執行緒其中的乙個。notifyall 喚...