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 可以用来挂起、唤醒某个指定的线程。
相关推荐
在计算机编程领域,多线程是一项关键的技术,尤其在当今的高性能计算和实时系统中扮演着重要角色。本文将深入探讨“多线程应用实例”这一主题,旨在帮助读者理解和掌握多线程的相关知识点。 首先,我们要理解什么是...
在IT行业中,多线程是Java编程中一个重要的高级特性,尤其对于开发高效能和响应迅速的应用至关重要。这个“多线程终极案例程序”旨在帮助Java开发者深化对多线程的理解,通过一个具体的“多兵种联合攻击防御塔”游戏...
Java中的单线程和多线程是编程中的关键概念,特别是在服务器端开发中。了解它们的原理和应用对于构建高效、可扩展的客户端-服务器应用至关重要。以下是对这些概念的详细解析。 首先,我们来谈谈单线程。在Java中,...
通过阅读这些文档和代码,读者不仅可以理解多线程编程的基本概念,还能掌握如何在实际项目中应用多线程技术,提高程序的并发性能。同时,通过分析和解决多线程编程中可能出现的问题,开发者可以编写出更加健壮和高效...
这些实例可以帮助理解如何在实际的代码中实现多线程以及如何在多线程环境下进行有效的协作。 6. Android开发中的多线程:虽然文档标题提到了Android,但在提供的内容中并没有直接提及Android多线程的特殊性。不过,...
通过学习这个例子,你可以深入理解C++中的多线程编程,包括如何创建和销毁线程、如何实现线程同步和通信,以及如何在VS2008这样的旧版本编译器中有效地使用多线程。这对于开发高并发、高性能的C++应用至关重要。
通过这个简单的源代码,我们可以学习到多线程的基本概念、工作原理以及如何在实际应用中运用。 1. **多线程的概念**:在计算机科学中,线程是程序执行的一个单一顺序控制流,是操作系统调度的基本单元。多线程则...
在本资源中,"多线程编程讲解与实例代码.rar" 包含了详细的理论讲解以及实际的代码示例,旨在帮助开发者深入理解并掌握多线程技术。 多线程编程的核心知识点包括以下几个方面: 1. **线程创建**:在大多数编程语言...
在这个未完成的案例中,我们可能正在探讨如何在Java中创建和管理线程,以及处理多线程环境下的并发问题。下面是对Java多线程基础知识的详细解释: 1. **线程的创建方式**: - 继承`Thread`类:自定义一个新的类,...
【多线程实验】是计算机科学中的一个重要实践环节,尤其在Java编程中,多线程技术是实现并发处理和高效能应用的关键。本实验旨在帮助学生深入理解和掌握线程的相关概念,包括线程调度机制、线程同步机制,以及如何在...
在Linux操作系统中,多进程和多线程是两种并发执行的方式,它们在处理并发问题时,经常需要进行同步和互斥操作,以确保数据的一致性和程序的正确性。本篇将详细介绍这两种并发模型以及如何在Linux环境中实现同步互斥...
在IT领域,多线程是程序设计中的一个重要概念,尤其对于服务器端开发和高并发应用来说,理解并熟练掌握多线程技术至关重要。本资源包针对初学者提供了全面的多线程学习资料,旨在帮助你快速入门并解决实际开发中的...
在IT领域,多线程和套接字编程是两个至关重要的概念,特别是在网络通信和并发处理方面。这里,我们深入探讨这两个主题,并结合你提供的文件列表进行解析。 首先,让我们来了解一下多线程编程。多线程是操作系统提供...
在编程领域,多线程是一种常见且重要的技术,特别是在C++这样的高级编程语言中。"生产者-消费者问题"是多线程编程中一个经典的同步问题,它涉及到资源的共享和线程间的协作。这个问题的核心在于如何有效地协调生产者...
在多线程版本中,还需要确保线程之间的协作和资源管理。 总之,"vc++分别用单-多线程读取数字"这个项目旨在展示在VC++环境中如何利用线程来处理数据。通过理解线程的基本概念、线程安全、同步机制以及性能优化,...
总的来说,这个基于多线程的电梯运行系统模拟是一个典型的并发编程案例,展示了如何在Java中利用多线程来处理并发任务,以及如何设计和实现线程间的协作和通信。通过分析和实现这样的项目,开发者可以提升对并发控制...
在现代软件开发中,多线程编程已成为提升程序性能和响应性的关键手段之一。Java作为一种广泛使用的编程语言,提供了丰富的多线程支持。然而,多线程编程同时也带来了一系列挑战,如线程安全问题、死锁等。本文将详细...
在多线程环境中,为了保证数据的安全性和一致性,我们需要使用互斥量(mutex)和同步机制。互斥量是一种锁,可以确保同一时间只有一个线程能访问被保护的资源。在C++11中,`std::mutex`类代表了互斥量。例如: ```...