多线程-单生产单消费模型
生活随笔
收集整理的這篇文章主要介紹了
多线程-单生产单消费模型
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
創建資源對象,提供保存和取出方法(使用synchronized代碼塊實現)
/*** Created by shaoqinghua on 2018/5/3.* 定義一個負責保存和取出的資源類*/ public class Resource {/*** 定義成員變量,充當保存和取出的容器*/private Object[] objs = new Object[1];/*** 定義一個同步的鎖對象*/private Object lock = new Object();/*** 保存數據*/public void save(Object obj) {synchronized (lock) {if (objs[0] != null) {//存在數據,保存線程不能執行保存操作,需要等待try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}objs[0] = obj;System.out.println(Thread.currentThread().getName() + " 正在保存的數據:" + objs[0]);//在生產者保存完數據后,需要喚醒消費線程lock.notify();}}/*** 取出數據*/public void get() {synchronized (lock) {if (objs[0] == null) {//沒有數據,無法取出,需要等待try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + "正在取出的數據:::::::" + objs[0]);objs[0] = null;//消費結束,需要通知生產者線程lock.notify();}}}創建生產者任務類
/*** 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() {//給資源倉庫保存數據while (true) {r.save("汽車");}} }創建消費者任務類
/*** 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() {//從資源倉庫取出數據while (true) {r.get();}} }測試類
/*** Created by shaoqinghua on 2018/5/3.* 測試單生產單消費*/ public class ThreadTest {public static void main(String[] args) {//創建資源對象Resource r = new Resource();//創建線程任務對象Productor pro = new Productor(r);Consumer con = new Consumer(r);//創建生產和消費的線程對象Thread t = new Thread(pro);Thread t2 = new Thread(con);//啟動線程t.start();t2.start();} }另外,Resource資源類也可使用JDK5之后的Lock和Condition實現
/*** Created by shaoqinghua on 2018/5/3.* 定義一個負責保存和取出的資源類*/ public class Resource {/*** 定義成員變量,充當保存和取出的容器*/private Object[] objs = new Object[1];/*** 定義JDK5之后的Lock鎖*/private Lock loc = new ReentrantLock();/*** 定義監視生產者線程的等待和喚醒對象*/private Condition proCon = loc.newCondition();/*** 定義監視消費者線程的等待和喚醒對象*/private Condition conCon = loc.newCondition();/*** 保存數據*/public void save(Object obj) {//手動獲取鎖對象loc.lock();try {if (objs[0] != null) {//存在數據,保存線程不能執行保存操作,需要等待try {proCon.await();} catch (InterruptedException e) {e.printStackTrace();}}objs[0] = obj;System.out.println(Thread.currentThread().getName() + " 正在保存的數據:" + objs[0]);//在生產者保存完數據后,需要喚醒消費線程conCon.signal();} finally {//手動釋放鎖對象loc.unlock();}}/*** 取出數據*/public void get() {//手動獲取鎖對象loc.lock();try {if (objs[0] == null) {//沒有數據,無法取出,需要等待try {conCon.await();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + "正在取出的數據:::::::" + objs[0]);objs[0] = null;//消費結束,需要通知生產者線程proCon.signal();} finally {//手動釋放鎖對象loc.unlock();}} }?
轉載于:https://my.oschina.net/LaravelShao/blog/1807245
總結
以上是生活随笔為你收集整理的多线程-单生产单消费模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ES6入门之Symbol
- 下一篇: 关于CTeX的几个大坑