`

Java多线程之Condition接口的实现

 
阅读更多
在实际中一个lock可产生多个Condition对象。个人认为这是用Condition的目的。通过不同的Condition的await()和signal()方法来控制由该lock.lock()锁定的代码段



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;

/**
 * 有时候线程取得lock后需要在一定条件下才能做某些工作,比如说经典的Producer和Consumer问题。
 * 在Java 5.0以前,这种功能是由Object类的wait(), notify()和notifyAll()等方法实现的,
 * 在5.0里面,这些功能集中到了Condition这个接口来实现。
 */
public class ConditionTest {

	/**
	 * 篮子程序,这里为了简化问题,篮子中最多只能有一个苹果。
	 * Consumer必须在篮子里有苹果的时候才能吃苹果,否则它必须暂时放弃对篮子的锁定,
	 * 等到Producer往篮子里放了苹果后再去拿来吃。而Producer必须等到篮子空了才能往里放苹果,
	 * 否则它也需要暂时解锁等Consumer把苹果吃了才能往篮子里放苹果。
	 */
	public static class Basket {
		// 锁
		Lock lock = new ReentrantLock();
		//	根据锁产生Condition对象

		Condition produced = lock.newCondition();
		Condition consumed = lock.newCondition();
		// 篮子中的苹果数,最多为1
		int num = 0;

		/**
		 * 生产苹果,往篮子里放
		 * @throws InterruptedException
		 */
		public void produce() throws InterruptedException {
			// 获得锁
			lock.lock();
			System.out.println("Producer get a lock...");
			try {
				// 判断是否满足生产条件
				while (num == 1) {
					// 如果有苹果,则不生产,放弃锁,进入睡眠
					// 等待消费者消费
					System.out.println("Producer sleep...");
				       [color=red] // consumed await,直到consumed signal[/color]
					consumed.await(); 
					System.out.println("Producer awaked...");
				}
				/*生产苹果*/
				Thread.sleep(500);
				System.out.println("Producer produced an Apple.");
				num = 1;
				// 通知等待produced Condition的线程
				produced.signal();
			} finally {
				lock.unlock();
			}
		}
		/**
		 * 消费苹果,从篮子中取
		 * @throws InterruptedException
		 */
		public void consume() throws InterruptedException {
			// 获得锁
			lock.lock();
			System.out.println("Consumer get a lock...");
			try {
				// 判断是否满足消费条件
				while (num == 0) {
					// 如果没有苹果,无法消费,则放弃锁,进入睡眠
					// 等待生产者生产苹果
					System.out.println("Consumer sleep...");
					produced.await();  
					System.out.println("Consumer awaked...");
				}
				/*吃苹果*/
				Thread.sleep(500);
				System.out.println("Consumer consumed an Apple.");
				num = 0;
				// 发信号唤醒某个等待consumed Condition的线程
				consumed.signal();
			} finally {
				lock.unlock();
			}
		}
	}
	/**
	 * 测试Basket程序
	 */
	public static void testBasket() throws Exception {
		final Basket basket = new Basket();
		//	定义一个producer
		Runnable producer = new Runnable() {
			public void run() {
				try {
					basket.produce();
				} catch (InterruptedException ex) {
					ex.printStackTrace();
				}
			}
		};

		// 定义一个consumer
		Runnable consumer = new Runnable() {
			public void run() {
				try {
					basket.consume();
				} catch (InterruptedException ex) {
					ex.printStackTrace();
				}
			}
		};

		//	各产生3个consumer和producer
		ExecutorService service = Executors.newCachedThreadPool();
		for (int i = 0; i < 3; i++){
			service.submit(producer);
		}
		for (int i = 0; i < 3; i++){
			service.submit(consumer);
		}
		service.shutdown();
	}      

	public static void main(String[] args) throws Exception {
		ConditionTest.testBasket();
	}
}
分享到:
评论

相关推荐

    java多线程模拟队列实现排队叫号

    总的来说,通过Java多线程和队列数据结构,我们可以有效地模拟排队叫号系统。这种模拟有助于理解和实践并发编程,同时也为我们解决实际问题提供了思路。在这个过程中,我们学习了线程同步、队列操作以及如何在Java中...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    Java多线程技术精讲

    Java多线程技术是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程是实现并发处理的关键技术,尤其在服务器端应用和高性能计算中不可或缺。 ...

    Java 多线程 PPT

    本文将深入探讨Java多线程的相关概念、线程类和接口的使用,以及线程的同步与互斥。 首先,我们需要理解进程与线程的基本概念。程序是一组静态指令的集合,而进程则是程序在执行过程中的一个实例,拥有独立的内存...

    Java多线程练习题

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,多线程的实现主要通过两种方式:继承Thread类和实现Runnable接口。理解并掌握多线程的使用对于任何Java开发者...

    java多线程实现生产者和消费者

    在Java编程中,多线程是一种重要的技术,它允许程序同时执行多个任务,提升系统效率。在并发编程中,"生产者-消费者"模式是一种经典的解决问题的范式,用于协调两个或更多线程间的协作,其中一部分线程(生产者)...

    现代多线程 JAVA和c++多线程实现 测试和调试

    在JAVA中,多线程的实现主要依赖于`Thread`类和`Runnable`接口。开发者可以通过直接继承`Thread`类或实现`Runnable`接口来创建新的线程。`Thread`类提供了线程的启动、同步和控制方法,如`start()`、`join()`和`...

    Java多线程资料

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了软件的效率和响应性。在Java中,多线程的实现主要有两种方式:通过继承Thread类和实现Runnable接口。这篇资料深入探讨了Java多线程的相关知识...

    【JAVA多线程】多线程编程核心技术学习资料

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程技术尤其关键,因为它们能够充分利用多核处理器的能力。这份"Java多线程编程...

    java多线程进阶

    1. **线程基础**:书中首先会介绍Java多线程的基础知识,包括线程的创建方式(如通过`Thread`类或实现`Runnable`接口)、线程的生命周期(新建、就绪、运行、阻塞和死亡),以及如何启动和停止线程。 2. **线程同步...

    Java多线程编辑核心技术

    Java多线程是Java编程语言的重要特性之一,它允许开发者在单个程序中同时运行多个部分,这些部分可以并发执行。掌握Java多线程技术对于设计高效的并发程序、充分利用多核处理器资源、提高应用程序的执行效率至关重要...

    Java多线程设计模式(带源码)

    通过阅读提供的"Java多线程设计模式详解.pdf"和"Java多线程设计模式上传文件",开发者可以深入学习这些模式的原理、实现方式以及实际应用场景,从而在实际工作中更好地运用多线程设计模式,提升软件的并发性能和质量...

    Java 多线程介绍

    Java多线程是Java编程语言中的一个重要特性,它允许在单个程序中同时执行多个线程,从而提高程序的效率和响应性。本文将深入探讨Java多线程的基础概念、线程的生命周期以及一些关键的线程控制方法,如`suspend()`和`...

    基于Java多线程同步技术的简易模拟售票系统实现.pdf

    根据给定文件的信息,本篇文档是关于Java多线程同步技术在简易模拟售票系统中的应用研究。文档详细介绍了多线程的概念、如何在Java中创建线程、线程同步技术以及如何利用这些技术来解决共享资源访问时的数据一致性...

    java多线程编程实例 (源程序)

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程可以通过实现Runnable接口或继承Thread类来创建。下面我们将深入探讨Java多线程编程的...

    java多线程作业.docx

    ### Java多线程知识点解析 #### 一、Java多线程概述 Java作为一种现代编程语言,内置了对多线程的支持。多线程允许应用程序同时处理多个任务,从而提高程序的响应性和整体性能。在多线程环境中,一个程序可以包含...

    java多线程笔记全手打

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的运行效率和资源利用率。本笔记全面涵盖了多线程的学习,包括基础理论和实践代码,旨在帮助开发者深入理解并掌握Java多线程技术。 一、...

    java 多线程的详细介绍和使用

    Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,从而提高系统效率。本篇文章将深入探讨Java中的多线程以及线程池的使用。 在Java中,多线程主要用于处理并发任务,这包括但不限于网络通信、...

    java多线程

    由于提供的文件内容大部分与Java多线程编程核心技术并无直接关联,而是关于电子书资源的联系方式和说明,因此不能直接从这部分内容中生成关于Java多线程的知识点。但考虑到描述中提到了电子书的标题以及它涉及的主题...

Global site tag (gtag.js) - Google Analytics