多线程之线程通信条件Condition

来源:互联网 发布:不出门知天下事的生肖 编辑:程序博客网 时间:2024/06/07 01:36

Condition是Locks锁下的另一种线程通信之间唤醒、阻塞的实现。它下面的await,和signal能够实现Object下的wait,notify和notifyAll的全部功能,除此之外改监视器和已绑定到每个条件,可以实现多条件的监听。Condition实质是被绑定到一个锁上,腰围特定的Lock实例获得Condition,即用 newCondition()方法。

Condition下的await()相对于Object下的wait(); 阻塞或中断之前状况,让其处于等待状态。

Condition下的Signal();相当于Object下的notify();唤醒一个等待的状态。


Condition应用:

假设有一个缓存区,大小100,它支持put和take方法。如果试图在空的缓存区上执行take操作,则在某一项变得可用之前,线程一直阻塞;如果试图在满的缓存区上执行操作,则在有空间变得可用之前,线程一直讲阻塞。我们可以使用两个条件,一个记录缓存区的满,一个记录缓存区的空。




package andy.thread.test;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * @author Zhang,Tianyou * @version 2014年11月9日 上午11:39:30 */public class ThreadConditiionBoundedBuffer {public static void main(String[] args) {BoundedBuffer buffer = new ThreadConditiionBoundedBuffer().new BoundedBuffer();for (int i = 0; i < 100; i++) {int task = i;new Thread((new Runnable() {public void run() {try {String putString  = Thread.currentThread().getName() + task;buffer.put(putString);System.out.println(putString);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}})).start();}        for (int i = 0; i < 100; i++) {new Thread((new Runnable() {public void run() {                   try {System.out.println( Thread.currentThread() + "take " + buffer.take());} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}})).start();}}class BoundedBuffer {// 定义锁Lock lock = new ReentrantLock();Condition notFull = lock.newCondition(); // 没有满Condition notEmpty = lock.newCondition(); // 不为空Object[] items = new Object[100];int putptr, takeptr, count;public void put(Object x) throws InterruptedException {lock.lock();try {// 如果已满 阻塞等待while (count == items.length)notFull.await();// 如果未满执行下面 添加items[putptr] = x;if (++putptr == items.length)putptr = 0;++count;// 唤醒读取缓冲的线程notEmpty.signal();} finally {lock.unlock();}}public Object take() throws InterruptedException {lock.lock();try {// 如果为空 等待while (count == 0)notEmpty.await();// 不为空按顺序去Object x = items[takeptr];if (++takeptr == items.length)takeptr = 0;--count;notFull.signal();return x;} finally {lock.unlock();}}}}

执行效果如下:

Thread-00Thread-22Thread-11Thread-1414Thread-1212Thread-1010Thread-88Thread-66Thread-44Thread-1616Thread-1818Thread-77Thread-2222Thread-2020Thread-55Thread-33Thread-2424Thread-2626Thread-99Thread-2828Thread-1313Thread-3030Thread-1717Thread-1111Thread-3232Thread-1919Thread-1515Thread-2121Thread-2323Thread-2525Thread-3434Thread-3131Thread-2727Thread-3333Thread-2929Thread-3535Thread-3636Thread-3737Thread-3838Thread-4040Thread-3939Thread-4242Thread-6464Thread-6666Thread-6262Thread-6060Thread-5858Thread-4747Thread-5656Thread-4545Thread-5050Thread-4848Thread-5252Thread-4646Thread-5454Thread-4444Thread-4343Thread-6868Thread-4141Thread-7070Thread-7272Thread-7474Thread-7676Thread-4949Thread-7878Thread-6969Thread-8080Thread-7171Thread-8282Thread-7373Thread-7575Thread-8484Thread-8686Thread-7777Thread-8888Thread-8181Thread-9090Thread-8989Thread-8383Thread-7979Thread-8787Thread-8585Thread-6767Thread-9292Thread-9191Thread-6565Thread-9494Thread-6363Thread-6161Thread-9696Thread-9898Thread-5959Thread-5757Thread-5555Thread-5353Thread-9393Thread-9595Thread[Thread-100,5,main]take Thread-00Thread-9999Thread[Thread-101,5,main]take Thread-22Thread[Thread-102,5,main]take Thread-11Thread-9797Thread[Thread-104,5,main]take Thread-44Thread[Thread-106,5,main]take Thread-66Thread[Thread-108,5,main]take Thread-88Thread[Thread-110,5,main]take Thread-1010Thread-5151Thread[Thread-112,5,main]take Thread-1212Thread[Thread-114,5,main]take Thread-1616Thread[Thread-116,5,main]take Thread-1818Thread[Thread-118,5,main]take Thread-77Thread[Thread-120,5,main]take Thread-2020Thread[Thread-122,5,main]take Thread-2222Thread[Thread-124,5,main]take Thread-55Thread[Thread-103,5,main]take Thread-1414Thread[Thread-126,5,main]take Thread-33Thread[Thread-128,5,main]take Thread-2424Thread[Thread-105,5,main]take Thread-2626Thread[Thread-130,5,main]take Thread-99Thread[Thread-107,5,main]take Thread-2828Thread[Thread-132,5,main]take Thread-1313Thread[Thread-109,5,main]take Thread-3030Thread[Thread-134,5,main]take Thread-1515Thread[Thread-111,5,main]take Thread-1111Thread[Thread-136,5,main]take Thread-1717Thread[Thread-113,5,main]take Thread-3232Thread[Thread-138,5,main]take Thread-1919Thread[Thread-140,5,main]take Thread-2121Thread[Thread-115,5,main]take Thread-2323Thread[Thread-142,5,main]take Thread-2525Thread[Thread-117,5,main]take Thread-3434Thread[Thread-144,5,main]take Thread-3131Thread[Thread-119,5,main]take Thread-2727Thread[Thread-146,5,main]take Thread-2929Thread[Thread-148,5,main]take Thread-3333Thread[Thread-121,5,main]take Thread-3535Thread[Thread-150,5,main]take Thread-3636Thread[Thread-152,5,main]take Thread-3737Thread[Thread-123,5,main]take Thread-4040Thread[Thread-125,5,main]take Thread-3838Thread[Thread-127,5,main]take Thread-3939Thread[Thread-154,5,main]take Thread-4242Thread[Thread-129,5,main]take Thread-6666Thread[Thread-156,5,main]take Thread-6464Thread[Thread-131,5,main]take Thread-6262Thread[Thread-158,5,main]take Thread-6060Thread[Thread-160,5,main]take Thread-5656Thread[Thread-137,5,main]take Thread-4545Thread[Thread-133,5,main]take Thread-5858Thread[Thread-135,5,main]take Thread-4747Thread[Thread-162,5,main]take Thread-5454Thread[Thread-139,5,main]take Thread-5252Thread[Thread-164,5,main]take Thread-5050Thread[Thread-143,5,main]take Thread-4646Thread[Thread-141,5,main]take Thread-4848Thread[Thread-145,5,main]take Thread-4444Thread[Thread-166,5,main]take Thread-4343Thread[Thread-147,5,main]take Thread-6868Thread[Thread-168,5,main]take Thread-4141Thread[Thread-157,5,main]take Thread-7070Thread[Thread-151,5,main]take Thread-7272Thread[Thread-170,5,main]take Thread-7474Thread[Thread-155,5,main]take Thread-7676Thread[Thread-153,5,main]take Thread-4949Thread[Thread-172,5,main]take Thread-7878Thread[Thread-149,5,main]take Thread-6969Thread[Thread-174,5,main]take Thread-8080Thread[Thread-159,5,main]take Thread-7171Thread[Thread-176,5,main]take Thread-8282Thread[Thread-161,5,main]take Thread-7373Thread[Thread-163,5,main]take Thread-7575Thread[Thread-178,5,main]take Thread-8484Thread[Thread-165,5,main]take Thread-8686Thread[Thread-167,5,main]take Thread-7777Thread[Thread-180,5,main]take Thread-8888Thread[Thread-182,5,main]take Thread-8181Thread[Thread-169,5,main]take Thread-9090Thread[Thread-184,5,main]take Thread-8989Thread[Thread-171,5,main]take Thread-8383Thread[Thread-173,5,main]take Thread-7979Thread[Thread-189,5,main]take Thread-8585Thread[Thread-183,5,main]take Thread-6161Thread[Thread-192,5,main]take Thread-5959Thread[Thread-187,5,main]take Thread-9898Thread[Thread-185,5,main]take Thread-9696Thread[Thread-179,5,main]take Thread-6363Thread[Thread-194,5,main]take Thread-5757Thread[Thread-181,5,main]take Thread-9494Thread[Thread-190,5,main]take Thread-6565Thread[Thread-177,5,main]take Thread-9191Thread[Thread-196,5,main]take Thread-5555Thread[Thread-175,5,main]take Thread-9292Thread[Thread-188,5,main]take Thread-6767Thread[Thread-191,5,main]take Thread-5353Thread[Thread-198,5,main]take Thread-9393Thread[Thread-186,5,main]take Thread-8787Thread[Thread-193,5,main]take Thread-9595Thread[Thread-195,5,main]take Thread-9999Thread[Thread-197,5,main]take Thread-9797Thread[Thread-199,5,main]take Thread-5151


1 0
原创粉丝点击