1. 程式人生 > >java多執行緒--ReentrantLock實現生產者與消費者模式

java多執行緒--ReentrantLock實現生產者與消費者模式

一.本例實現 :一對一交替列印,

一.生產者邏輯 :每次只允許一個生產者來進行生產操作(生產者之間互斥訪問倉庫),必須等消費者取走資料之後,才能進行下一次的生產

二.消費者邏輯 :每次只允許一個消費者來進行生產操作(消費者之間互斥訪問倉庫),必須等生產者生產資料之後,才能進行下一次的消費。

二.倉庫類:

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();
		
	}

}



六。測試結果:

列印*
列印&
列印*
列印&
列印*
列印&
列印*
列印&
列印*
列印&