`
bo_hai
  • 浏览: 554160 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Condition 在多线程协作中应用实例

阅读更多
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class NewPlate {

	private List<Object> eggs = new ArrayList<Object>();
	
	private Lock lock = new ReentrantLock();
	
	private Condition condition = lock.newCondition();
	
	public Object getEgg() {
		lock.lock();
		try {
			while(eggs.size() == 0) {
				try {
					condition.await();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			Object egg = eggs.get(0);
			eggs.clear(); //清空
			condition.signalAll();
			System.out.println("拿到鸡蛋");
			return egg;
		} finally {
			lock.unlock();
		}
	}
	
	public void addEgg(Object egg) {
		lock.lock();
		try {
			while(eggs.size() > 0) {
				try {
					condition.await();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			eggs.add(egg);
			condition.signalAll();
			System.out.println("放入鸡蛋");
		} finally {
			lock.unlock();
		}
	}
	
	public static void main(String[] args) {
		Plate plate = new Plate();
		ExecutorService exec = Executors.newCachedThreadPool();
		for (int i = 0; i < 10; i++) {
			exec.execute(new GetEggThread(plate));
			exec.execute(new AddEggThread(plate));
		}
		exec.shutdown();
	}
}

 上面的实例不能体现出 Condition 魅力。看下面的程序:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class NewestPlate {

	private List<Object> eggs = new ArrayList<Object>();
	
	private Lock lock = new ReentrantLock();
	
	private Condition addCond = lock.newCondition();

	private Condition getCond = lock.newCondition();
	
	public Object getEgg() {
		lock.lock();
		try {
			while(eggs.size() == 0) {
				try {
					getCond.await();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			Object egg = eggs.get(0);
			eggs.clear(); //清空
			addCond.signalAll();
			System.out.println("拿到鸡蛋");
			return egg;
		} finally {
			lock.unlock();
		}
	}
	
	public void addEgg(Object egg) {
		lock.lock();
		try {
			while(eggs.size() > 0) {
				try {
					addCond.await();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			eggs.add(egg);
			getCond.signalAll();
			System.out.println("放入鸡蛋");
		} finally {
			lock.unlock();
		}
	}
	
	public static void main(String[] args) {
		Plate plate = new Plate();
		ExecutorService exec = Executors.newCachedThreadPool();
		for (int i = 0; i < 10; i++) {
			exec.execute(new AddEggThread(plate));
			exec.execute(new GetEggThread(plate));
		}
		exec.shutdown();
	}

}

 Condition 可以用来挂起、唤醒某个指定的线程。

分享到:
评论
2 楼 bo_hai 2014-09-04  
Condition 用于线程之间的协助。
1 楼 bo_hai 2014-01-16  
Condition的强大之处在于它可以为多个线程间建立不同的Condition

相关推荐

Global site tag (gtag.js) - Google Analytics