`

jdk1.5条件阻塞Condition的应用

阅读更多
package cn.com.songjy.test.socket.thread;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 
 * ClassName:ConditionCommunication 
 * jdk1.5条件阻塞Condition的应用(通信)
 * 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次
 * 
 * @author songjy
 * @version 1.0
 * @since v1.0
 * @Date 2013-8-22 下午2:22:53
 */
public class ConditionCommunication {

	public static void main(String[] args) {

		final Businese businese = new Businese();

		new Thread(new Runnable() {
			public void run() {
				for (int j = 0; j < 50; j++) {
					businese.sub(j);
				}
			}
		}).start();

		for (int j = 0; j < 50; j++) {
			businese.main(j);
		}
	}

	static class Businese {

		private static Log log = LogFactory.getLog(Businese.class);
		private boolean sub = true;
		private Lock lock = new ReentrantLock();
		Condition condition = lock.newCondition();

		public /*synchronized*/ void sub(int j) {/*synchronized被Lock代替*/
			lock.lock();
			try {
				/* 这里用while不用if是因为有可能出现假唤醒的情况 */
				while (!sub) {// 还没有轮到我(sub),继续等待(睡觉)
					try {
						//wait();
						condition.await();/*代替wait(),但切记不要误写成condition.wait()*/
					} catch (InterruptedException e) {
						log.error(e.getMessage(), e);
					}
				}
				for (int i = 0; i < 10; i++) {
					log.info("sup thread sequence of" + i + "loop of " + j);
				}

				sub = false;// 执行完毕,变更状态
				//notify();// 本次执行完毕,唤醒其他线程(main)
				condition.signal();/*代替notify()*/
			} catch (Exception e) {
				log.error(e.getMessage(), e);
			} finally {
				lock.unlock();//最终必须释放锁,即使程序出错!
			}
		}

		public /*synchronized*/ void main(int j) {
			lock.lock();
			try {
				/* 这里用while不用if是因为有可能出现假唤醒的情况 */
				while (sub) {// 还没有轮到我(main),继续等待(睡觉)
					try {
						//wait();
						condition.await();/*代替wait(),但切记不要误写成condition.wait()*/
					} catch (InterruptedException e) {
						log.error(e.getMessage(), e);
					}
				}
				for (int i = 0; i < 100; i++) {
					log.info("main thread sequence of" + i + "loop of " + j);
				}
				sub = true;// 执行完毕,变更状态
				//notify();// 本次执行完毕,唤醒其他线程(sub)
				condition.signal();/*代替notify()*/
			} catch (Exception e) {
				log.error(e.getMessage(), e);
			} finally {
				lock.unlock();//即使程序出错也必须释放锁
			}
		}
	}
	
}

/*备注:wait()、notify()和notifyAll()都是Object类中的final方法,被所有的类继承、且不允许重写的方法*/ 


package cn.com.songjy.test.socket.thread;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 
 * ClassName:ConditionCommunication 
 * jdk1.5条件阻塞Condition的应用(通信)
 * 子线程1循环5次,接着子线程2循环10次,最后主线程循环15次,接着又回到子线程1循环5次,接着子线程2循环10次,最后主线程循环15次,如此循环10次
 * 
 * @author songjy
 * @version 1.0
 * @since v1.0
 * @Date 2013-8-22 下午2:22:53
 */
public class ThreeConditionCommunication {

	public static void main(String[] args) {

		final Businese businese = new Businese();

		new Thread(new Runnable() {
			public void run() {
				for (int j = 0; j < 10; j++) {
					businese.sub1(j);
				}
			}
		}).start();
		
		new Thread(new Runnable() {
			public void run() {
				for (int j = 0; j < 10; j++) {
					businese.sub2(j);
				}
			}
		}).start();

		for (int j = 0; j < 10; j++) {
			businese.main(j);
		}
	}

	static class Businese {

		private static Log log = LogFactory.getLog(Businese.class);
		private int sub = 0;
		private Lock lock = new ReentrantLock();
		Condition condition1 = lock.newCondition();
		Condition condition2 = lock.newCondition();
		Condition condition3 = lock.newCondition();

		public void sub1(int j) {
			lock.lock();
			try {
				/* 这里用while不用if是因为有可能出现假唤醒的情况 */
				while (0 != sub) {// 还没有轮到我(sub1),继续等待(睡觉)
					try {
						condition1.await();/*切记不要误写成condition.wait()*/
					} catch (InterruptedException e) {
						log.error(e.getMessage(), e);
					}
				}
				for (int i = 0; i < 5; i++) {
					log.info("sup1 thread sequence of" + i + "loop of " + j);
				}

				sub = 1;// 执行完毕,变更状态
				condition2.signal();/*唤醒sub2线程*/
			} catch (Exception e) {
				log.error(e.getMessage(), e);
			} finally {
				lock.unlock();//最终必须释放锁,即使程序出错!
			}
		}
		
		public void sub2(int j) {
			lock.lock();
			try {
				/* 这里用while不用if是因为有可能出现假唤醒的情况 */
				while (1 != sub) {// 还没有轮到我(sub2),继续等待(睡觉)
					try {
						condition2.await();/*切记不要误写成condition.wait()*/
					} catch (InterruptedException e) {
						log.error(e.getMessage(), e);
					}
				}
				for (int i = 0; i < 10; i++) {
					log.info("sup2 thread sequence of" + i + "loop of " + j);
				}

				sub = 2;// 执行完毕,变更状态
				condition3.signal();/*唤醒main线程*/
			} catch (Exception e) {
				log.error(e.getMessage(), e);
			} finally {
				lock.unlock();//最终必须释放锁,即使程序出错!
			}
		}

		public void main(int j) {
			lock.lock();
			try {
				/* 这里用while不用if是因为有可能出现假唤醒的情况 */
				while (2 != sub) {// 还没有轮到我(main),继续等待(睡觉)
					try {
						//wait();
						condition3.await();/*切记不要误写成condition.wait()*/
					} catch (InterruptedException e) {
						log.error(e.getMessage(), e);
					}
				}
				for (int i = 0; i < 15; i++) {
					log.info("main thread sequence of" + i + "loop of " + j);
				}
				sub = 0;// 执行完毕,变更状态
				condition1.signal();/*唤醒sub1线程*/
			} catch (Exception e) {
				log.error(e.getMessage(), e);
			} finally {
				lock.unlock();//即使程序出错也必须释放锁
			}
		}
	}
	
}

/*备注:wait()、notify()和notifyAll()都是Object类中的final方法,被所有的类继承、且不允许重写的方法*/ 


package cn.com.songjy.test.socket.thread;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 
 * ClassName:BoundedBuffer
 * 缓冲模拟(不是缓存)
 *
 * @author   songjy
 * @version  1.0
 * @since    v1.0
 * @Date	 2013-8-23	上午9:40:18
 */
class BoundedBuffer {
	
	final Lock lock = new ReentrantLock();
	final Condition notFull = lock.newCondition();
	final Condition notEmpty = lock.newCondition();

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


来自:http://down.51cto.com/data/443438
  • 大小: 226.2 KB
  • 大小: 246.7 KB
分享到:
评论

相关推荐

    Java JDK1.5 生产消费者模式解决方案

    相比`synchronized`,`Lock`提供了更多的功能,比如可重入性、尝试获取锁(非阻塞)、可中断的锁等待以及条件变量(`Condition`)等。`Condition`允许我们创建多个独立的等待队列,这样可以更灵活地控制线程间的通信...

    JDK1.4.2官方英文API

    JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的软件开发工具包,它包含了编译、调试、运行Java程序所需的各种工具和库。JDK 1.4.2 是Java历史上的一个重要版本,发布于2004年,它引入了许多...

    java中的Lock类和Condition类.docx

    在JDK 1.5及之后的版本中,Lock类作为替代synchronized关键字的一种方式出现,提供了更精细的锁管理机制。 1. **Lock类** - Lock是一个接口,其主要实现类有ReentrantLock(可重入锁)。ReentrantLock不仅具备了...

    经典Java多线程与并发库高级应用

    总结来说,Java多线程与并发库的高级应用,既包括了传统的多线程编程技术,也包含了JDK 1.5之后引入的高级并发工具和特性。掌握这些知识点对于任何想要在Java编程领域深入发展的开发者来说,都是非常必要的。

    基于JDK源码解析Java领域中的并发锁之设计与实现.pdf

    Condition接口提供了比synchronized更细粒度的线程间通信机制,它允许线程等待特定条件,而不仅仅是等待锁的释放。当线程调用condition的await()方法时,会释放当前持有的锁,进入等待状态,直到其他线程调用signal...

    Android多线程全新讲解[整理].pdf

    Java提供了多种机制来实现这一点,如`synchronized`关键字、`wait()`, `notify()`和`notifyAll()`方法,以及JDK 1.5之后引入的`Lock`和`Condition`接口。`ThreadLocal`类则允许在线程范围内创建独立的数据副本,实现...

    每日练习:Java中的线程之线程间的通信教程.doc

    ReentrantLock不仅具备synchronized的互斥性,还支持条件条件(Condition),通过newCondition()可以创建多个条件,每个条件对应一组等待线程,可以精确控制线程的唤醒。 线程的生命周期包括新建、就绪、运行、阻塞...

    Android多线程全新讲解.pdf

    JDK 1.5引入了更多的同步工具类,如线程池`ExecutorService`,它允许更有效地管理线程,避免频繁创建和销毁线程带来的开销。`Callable`和`Future`接口提供了获取线程执行结果的能力,而`Future`的`get()`方法可以...

    java加强笔记

    Java5条件阻塞Condition的应用 - `Condition`接口提供了比`wait()`和`notify()`更强大的条件等待/唤醒机制。 ##### 14. Java5的Semaphere同步工具 - `Semaphore`是一种计数信号量,可以控制多个线程对共享资源的...

    Java并发编程原理与实战

    线程之间通信之join应用与实现原理剖析.mp4 ThreadLocal 使用及实现原理.mp4 并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 ...

    java thread 分析

    2.2.2 Waiting on condition的线程可能在等待条件变量(如`java.util.concurrent.locks.Condition`)的变化。 2.2.3 等待监控器入口(Waiting for monitor entry)和在`Object.wait()`中的线程表示存在资源争用,...

    java 门锁终于被打开了(解决死锁)

    7. **使用Condition**:`ReentrantLock`的`Condition`接口可以更好地控制线程间的协作,避免死锁。 回到我们的示例代码`DoorOpen.java`,很可能是演示了如何正确使用门锁以及解决死锁问题的实例。可能包含了模拟两...

    多线程问题

    例如,在JDK 1.5中引入了新的并发API,并在后续版本中持续改进和优化了这些并发工具,使得Java并发编程变得更加简便和安全。 总之,Java多线程编程极大地增强了程序处理并发任务的能力,但是在享受多线程带来的好处...

    java的concurrent用法详解

    - 支持条件变量(Condition),这使得线程可以在等待特定条件满足时释放锁,条件满足后再重新获得锁继续执行。 ##### 2.3 阻塞队列 阻塞队列(`BlockingQueue`)是一种特殊的队列,当队列为空时,从队列中获取元素...

    ArrayBlockingQueue源码解析-动力节点共

    在并发环境下,为了保证线程安全,ArrayBlockingQueue采用了ReentrantLock(可重入锁)来实现同步,并且在某些关键操作中使用了Condition(条件变量)来实现等待/通知机制。 1. 初始化:ArrayBlockingQueue在创建时...

    大并发编程交流

    `Condition` 是与 `ReentrantLock` 配合使用的条件对象,可以替代传统的 `wait()` 和 `notify()` 方法实现更加灵活的线程间通信。 - **AtomicInteger、ConcurrentHashMap、ArrayBlockingQueue**:这些类是 Java 并...

    Java并发编程--BlockingQueue.docx

    JDK 提供的几种阻塞队列实现: 1. ArrayBlockingQueue:基于数组的有界阻塞队列,线程安全,遵循先进先出(FIFO)原则,可以通过构造函数设置容量。 2. LinkedBlockingQueue:基于链表的有界阻塞队列,默认无大小...

    java笔试面试大全-附答案

    - **同步机制**:synchronized关键字、Lock锁(如ReentrantLock)、信号量Semaphore、条件变量Condition等。 - **线程状态**:新建、就绪、运行、阻塞、死亡。 4. **反射**: - 反射API:Class类、Constructor类...

    Java中ReentrantLock的使用.docx

    Condition的等待和唤醒操作比Object的wait/notify更安全,因为它们只能在已获取锁的上下文中执行,减少了死锁和竞态条件的风险。 ReentrantLock的这些特性使得它在某些复杂的并发场景下更为适用,例如,当需要精确...

Global site tag (gtag.js) - Google Analytics