日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多线程-单生产单消费模型

發(fā)布時(shí)間:2023/12/6 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程-单生产单消费模型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

創(chuàng)建資源對象,提供保存和取出方法(使用synchronized代碼塊實(shí)現(xiàn))

/*** Created by shaoqinghua on 2018/5/3.* 定義一個(gè)負(fù)責(zé)保存和取出的資源類*/ public class Resource {/*** 定義成員變量,充當(dāng)保存和取出的容器*/private Object[] objs = new Object[1];/*** 定義一個(gè)同步的鎖對象*/private Object lock = new Object();/*** 保存數(shù)據(jù)*/public void save(Object obj) {synchronized (lock) {if (objs[0] != null) {//存在數(shù)據(jù),保存線程不能執(zhí)行保存操作,需要等待try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}objs[0] = obj;System.out.println(Thread.currentThread().getName() + " 正在保存的數(shù)據(jù):" + objs[0]);//在生產(chǎn)者保存完數(shù)據(jù)后,需要喚醒消費(fèi)線程lock.notify();}}/*** 取出數(shù)據(jù)*/public void get() {synchronized (lock) {if (objs[0] == null) {//沒有數(shù)據(jù),無法取出,需要等待try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + "正在取出的數(shù)據(jù):::::::" + objs[0]);objs[0] = null;//消費(fèi)結(jié)束,需要通知生產(chǎn)者線程lock.notify();}}}

創(chuàng)建生產(chǎn)者任務(wù)類

/*** Created by shaoqinghua on 2018/5/3.*/ public class Productor implements Runnable {private Resource r;public Productor(Resource r) {this.r = r;}@Overridepublic void run() {//給資源倉庫保存數(shù)據(jù)while (true) {r.save("汽車");}} }

創(chuàng)建消費(fèi)者任務(wù)類

/*** Created by shaoqinghua on 2018/5/3.*/ public class Consumer implements Runnable {private Resource r;public Consumer(Resource r) {this.r = r;}@Overridepublic void run() {//從資源倉庫取出數(shù)據(jù)while (true) {r.get();}} }

測試類

/*** Created by shaoqinghua on 2018/5/3.* 測試單生產(chǎn)單消費(fèi)*/ public class ThreadTest {public static void main(String[] args) {//創(chuàng)建資源對象Resource r = new Resource();//創(chuàng)建線程任務(wù)對象Productor pro = new Productor(r);Consumer con = new Consumer(r);//創(chuàng)建生產(chǎn)和消費(fèi)的線程對象Thread t = new Thread(pro);Thread t2 = new Thread(con);//啟動(dòng)線程t.start();t2.start();} }

另外,Resource資源類也可使用JDK5之后的Lock和Condition實(shí)現(xiàn)

/*** Created by shaoqinghua on 2018/5/3.* 定義一個(gè)負(fù)責(zé)保存和取出的資源類*/ public class Resource {/*** 定義成員變量,充當(dāng)保存和取出的容器*/private Object[] objs = new Object[1];/*** 定義JDK5之后的Lock鎖*/private Lock loc = new ReentrantLock();/*** 定義監(jiān)視生產(chǎn)者線程的等待和喚醒對象*/private Condition proCon = loc.newCondition();/*** 定義監(jiān)視消費(fèi)者線程的等待和喚醒對象*/private Condition conCon = loc.newCondition();/*** 保存數(shù)據(jù)*/public void save(Object obj) {//手動(dòng)獲取鎖對象loc.lock();try {if (objs[0] != null) {//存在數(shù)據(jù),保存線程不能執(zhí)行保存操作,需要等待try {proCon.await();} catch (InterruptedException e) {e.printStackTrace();}}objs[0] = obj;System.out.println(Thread.currentThread().getName() + " 正在保存的數(shù)據(jù):" + objs[0]);//在生產(chǎn)者保存完數(shù)據(jù)后,需要喚醒消費(fèi)線程conCon.signal();} finally {//手動(dòng)釋放鎖對象loc.unlock();}}/*** 取出數(shù)據(jù)*/public void get() {//手動(dòng)獲取鎖對象loc.lock();try {if (objs[0] == null) {//沒有數(shù)據(jù),無法取出,需要等待try {conCon.await();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + "正在取出的數(shù)據(jù):::::::" + objs[0]);objs[0] = null;//消費(fèi)結(jié)束,需要通知生產(chǎn)者線程proCon.signal();} finally {//手動(dòng)釋放鎖對象loc.unlock();}} }

?

轉(zhuǎn)載于:https://my.oschina.net/LaravelShao/blog/1807245

總結(jié)

以上是生活随笔為你收集整理的多线程-单生产单消费模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。