生活随笔
收集整理的這篇文章主要介紹了
Java多线程之线程通信之生产者消费者阻塞队列版
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Java多線程之線程通信之生產(chǎn)者消費(fèi)者傳統(tǒng)版和阻塞隊(duì)列版
目錄
線程通信之生產(chǎn)者消費(fèi)者傳統(tǒng)版線程通信之生產(chǎn)者消費(fèi)者阻塞隊(duì)列版
1. 線程通信之生產(chǎn)者消費(fèi)者傳統(tǒng)版
題目: 一個初始值為零的變量,兩個線程對其交替操作,一個加1一個減1,來五輪
1.代碼實(shí)現(xiàn)
import java
.util
.concurrent
.locks
.Condition
;
import java
.util
.concurrent
.locks
.Lock
;
import java
.util
.concurrent
.locks
.ReentrantLock
;class ShareData { private int number
= 0;private Lock lock
= new ReentrantLock();private Condition condition
= lock
.newCondition();public void increment() throws Exception
{lock
.lock();try {while (number
!= 0) {condition
.await();}number
++;System
.out
.println(Thread
.currentThread().getName() + "\t" + number
);condition
.signalAll();} catch (Exception e
) {e
.printStackTrace();} finally {lock
.unlock();}}public void decrement() throws Exception
{lock
.lock();try {while (number
== 0) {condition
.await();}number
--;System
.out
.println(Thread
.currentThread().getName() + "\t" + number
);condition
.signalAll();} catch (Exception e
) {e
.printStackTrace();} finally {lock
.unlock();}}}
public class ProdConsumer_TraditionDemo {public static void main(String
[] args
) {ShareData shareData
= new ShareData();new Thread(() -> {for (int i
= 1; i
<=5 ; i
++) {try {shareData
.increment();} catch (Exception e
) {e
.printStackTrace();}}},"AA").start();new Thread(() -> {for (int i
= 1; i
<=5 ; i
++) {try {shareData
.decrement();} catch (Exception e
) {e
.printStackTrace();}}},"BB").start();}
}
2.編譯結(jié)果
2. 線程通信之生產(chǎn)者消費(fèi)者阻塞隊(duì)列版
題目: 一個初始值為零的變量,兩個線程對其交替操作,一個加1一個減1,來五輪
1.代碼實(shí)現(xiàn)
import java
.util
.concurrent
.ArrayBlockingQueue
;
import java
.util
.concurrent
.BlockingQueue
;
import java
.util
.concurrent
.TimeUnit
;
import java
.util
.concurrent
.atomic
.AtomicInteger
;class MyResource {private volatile boolean FLAG
= true; private AtomicInteger atomicInteger
= new AtomicInteger();BlockingQueue
<String> blockingQueue
= null
;public MyResource(BlockingQueue
<String> blockingQueue
) {this.blockingQueue
= blockingQueue
;System
.out
.println(blockingQueue
.getClass().getName());}public void myProdu() throws Exception
{String data
= null
;boolean retValue
;while (FLAG
) {data
= atomicInteger
.incrementAndGet() + "";retValue
= blockingQueue
.offer(data
, 2L
, TimeUnit
.SECONDS
);if (retValue
) {System
.out
.println(Thread
.currentThread().getName() + "\t 插入隊(duì)列" + data
+ "成功");} else {System
.out
.println(Thread
.currentThread().getName() + "\t 插入隊(duì)列" + data
+ "失敗");}try {TimeUnit
.SECONDS
.sleep(1);} catch (InterruptedException e
) {e
.printStackTrace();}}System
.out
.println(Thread
.currentThread().getName() + "\t 大老板叫停了,表示FLAG=false,生產(chǎn)動作結(jié)束");}public void myConsumer() throws Exception
{String result
= null
;while (FLAG
) {result
= blockingQueue
.poll(2L
, TimeUnit
.SECONDS
);if (null
== result
|| result
.equalsIgnoreCase("")) {FLAG
= false;System
.out
.println(Thread
.currentThread().getName() + "\t 超過2秒鐘沒有取到蛋糕,消費(fèi)退出");System
.out
.println();System
.out
.println();return;}System
.out
.println(Thread
.currentThread().getName() + "\t 消費(fèi)隊(duì)列蛋糕" + result
+ "成功");}}public void stop()throws Exception
{this.FLAG
= false;}
}
public class ProdConsumer_BlockQueueDemo {public static void main(String
[] args
) throws Exception
{MyResource myResource
= new MyResource(new ArrayBlockingQueue<>(10));new Thread(() -> {System
.out
.println(Thread
.currentThread().getName() + "\t 生產(chǎn)線程啟動");try {myResource
.myProdu();} catch (Exception e
) {e
.printStackTrace();}}, "Prod").start();new Thread(() -> {System
.out
.println(Thread
.currentThread().getName() + "\t 消費(fèi)線程啟動");System
.out
.println();System
.out
.println();try {myResource
.myConsumer();System
.out
.println();System
.out
.println();} catch (Exception e
) {e
.printStackTrace();}}, "Consumer").start();try {TimeUnit
.SECONDS
.sleep(5);} catch (InterruptedException e
) {e
.printStackTrace();}System
.out
.println();System
.out
.println();System
.out
.println();System
.out
.println("5秒鐘時間到,大老板main線程叫停,活動結(jié)束");myResource
.stop();}
}
執(zhí)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的Java多线程之线程通信之生产者消费者阻塞队列版的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。