1. 程式人生 > >java併發之----實現生產者/消費者模式(操作值&一對一交替列印)

java併發之----實現生產者/消費者模式(操作值&一對一交替列印)

一、實現生產者/消費者模式

1、一生產與一消費:操作值

利用synchronized 實現,程式碼如下:

public class Producer {
	private String lock;
	public Producer(String lock){
		this.lock = lock;
	}
	
	public void setValue(){
		try{
			synchronized (lock) {
				if(!ValueObject.value.equals("")){
					lock.wait();
				}
				String value =
System.currentTimeMillis()+"_"+System.nanoTime(); System.out.println("set的值是:"+ value); ValueObject.value = value; lock.notify(); } }catch(InterruptedException e){ e.printStackTrace(); } } } public class Consumer { private String lock; public Consumer(String lock){ this.lock =
lock; } public void getValue(){ try{ synchronized (lock) { if(ValueObject.value.equals("")){ lock.wait(); } System.out.println("get的值是:"+ ValueObject.value); ValueObject.value = ""; lock.notify(); } }catch(InterruptedException e){ e.printStackTrace(); } }
}
public class ValueObject {
	public static String value = "";
}
public class ThreadP extends Thread{
	private Producer producer;
	
	public ThreadP(Producer producer){
		this.producer = producer;
	}
	
	@Override
	public void run(){
		while(true){
			producer.setValue();
		}
	}
}
public class ThreadC extends Thread{
	private Consumer consumer;
	
	public ThreadC(Consumer consumer){
		this.consumer = consumer;
	}
	
	@Override
	public void run(){
		while(true){
			consumer.getValue();
		}
	}
}
public class PAndC {
	public static void main(String[] args) throws InterruptedException{
		String lock = new String("");
		Producer p = new Producer(lock);
		Consumer c = new Consumer(lock);
		ThreadP threadP = new ThreadP(p);
		ThreadC threadC = new ThreadC(c);
		threadP.start();
		Thread.sleep(1000);
		threadC.start();
	}
}

在這裡插入圖片描述

2、一對一交替列印A、B

利用ReentrantLock 與Condition 實現,程式碼如下:

public class MyService {
	private ReentrantLock lock = new ReentrantLock();
	private Condition condition = lock.newCondition();
	private boolean hasValue = false;
	
	public void printA(){
		try{
			lock.lock();
			while(hasValue == true){
				condition.await();
			}
			System.out.println("列印A");
			hasValue = true;
			condition.signal();
		}catch(InterruptedException e){
			e.printStackTrace();
		}finally{
			lock.unlock();
		}
	}
	
	public void printB(){
		try{
			lock.lock();
			while(hasValue == false){
				condition.await();
			}
			System.out.println("列印B");
			hasValue = false;
			condition.signal();
		}catch(InterruptedException e){
			e.printStackTrace();
		}finally{
			lock.unlock();
		}
	}
}
public class ThreadA extends Thread{
	private MyService service;
	
	public ThreadA(MyService service){
		this.service = service;
	}
	
	@Override
	public void run(){
		for(int i=0; i<5; i++){//交替列印5對A、B,將5替換為Integer.MAX_VALUE即可不斷列印
			service.printA();
		}
	}
}

public class ThreadB extends Thread{
	private MyService service;
	
	public ThreadB(MyService service){
		this.service = service;
	}
	
	@Override
	public void run(){
		for(int i=0; i<5; i++){
			service.printB();
		}
	}
}
public class ProducersAndConsumers {

	public static void main(String[] args) {
		MyService service = new MyService();
		
		ThreadA A = new ThreadA(service);
		ThreadB B = new ThreadB(service);
		A.start();
		B.start();
	}
}

在這裡插入圖片描述

二、參考

《Java多執行緒程式設計核心技術》高洪巖