java多執行緒--ReentrantLock實現生產者與消費者模式
阿新 • • 發佈:2019-02-01
一.本例實現 :一對一交替列印,
一.生產者邏輯 :每次只允許一個生產者來進行生產操作(生產者之間互斥訪問倉庫),必須等消費者取走資料之後,才能進行下一次的生產
二.消費者邏輯 :每次只允許一個消費者來進行生產操作(消費者之間互斥訪問倉庫),必須等生產者生產資料之後,才能進行下一次的消費。
二.倉庫類:
三.生產者:package lock.produce.comsumer; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class MyService { private ReentrantLock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); private boolean hasValue = false; /** * 生產資料 */ public void set(){ try { lock.lock(); //獲取監視器物件,即獲取鎖 while(hasValue){ condition.await(); } System.out.println("列印*"); hasValue = true; //只允許當前一個執行緒進來,且是消費執行緒進來 condition.signal(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ lock.unlock(); } } /** * 消費資料 */ public void get(){ try { lock.lock(); //獲取監視器物件,即獲取鎖 while(!hasValue){ condition.await(); } System.out.println("列印&"); hasValue = false; //只允許當前一個執行緒進來,且是生產者執行緒進來 condition.signal(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ lock.unlock(); } } }
四.消費者類:package lock.produce.comsumer; /** * 生產者執行緒 * @author Administrator * */ public class MyThreadA extends Thread{ private MyService myService; public MyThreadA(MyService myService){ this.myService = myService; } public void run(){ for(int i=0;i<5;i++){ myService.set(); } } }
package lock.produce.comsumer;
public class MyThreadB extends Thread{
/**
* 消費者執行緒
*/
private MyService myService;
public MyThreadB(MyService myService){
this.myService = myService;
}
public void run(){
for(int i=0;i<5;i++){
myService.get();
}
}
}
五。測試類:
package lock.produce.comsumer; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub MyService myService = new MyService(); MyThreadA a = new MyThreadA(myService); a.start(); MyThreadB b = new MyThreadB(myService); b.start(); } }
六。測試結果:
列印*
列印&
列印*
列印&
列印*
列印&
列印*
列印&
列印*
列印&