- 浏览: 254413 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (232)
- 瞎扯两句 (8)
- 操作系统 (5)
- 工作笔记 (33)
- 设计模式 (1)
- java (57)
- Java IDE (7)
- hibernate (17)
- oracle (46)
- ms sql (2)
- spring (9)
- struts2 (0)
- javascript (16)
- java_code (2)
- java之集合 (2)
- java之线程 (4)
- java之IO (4)
- java之虚拟机 (6)
- java之异常 (0)
- EJB (4)
- XML (4)
- 数据结构-算法 (2)
- 架构设计 (5)
- 配置信息 (2)
- 阅读笔记 (6)
- IT专业英语 (1)
- PI (0)
- 单元测试 (1)
最新评论
在实际中一个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 condition lock
2013-06-14 14:13 941package com.cn.whu; import ... -
servletcontext 的获取
2013-05-12 20:10 480容器在初始化servlet时,会为其注入servletconf ... -
取得下一个sequence。 getNextInterval
2013-03-15 11:47 9431. 初始sequence值放置于数据库。 2. 启动时产 ... -
java 脚本,编译与注解处理
2013-02-05 10:04 8551.java中支持脚本调用 通过脚本引擎来执行。 Obj ... -
java 安全管理器
2013-02-04 11:24 8351.在java语言实现中,扩展和系统加载器都是java实现的, ... -
RMI 底层实现
2013-01-28 16:43 9181. server端代码: Registry regist ... -
Java获取当前路径
2013-01-22 18:12 898无论是抽象路径名还是路径名字符串,都可以是绝对 路径名或相对 ... -
java1.5 新特性
2013-01-10 16:50 766"JDK1.5"的一个重要主题就是通过新增 ... -
import static静态导入
2013-01-10 12:12 850import static静态导入是JDK1.5中的新特性。一 ... -
类加载器加载的类的访问权限问题
2013-01-04 15:34 10561.父加载器加载的类不能访问子加载器加载的类。 (向下可见性) ... -
java 内部类总结
2012-12-28 12:31 747主要从分类和使用情境来看 1. 普通内部类。 位置: 在 ... -
java构造函数和静态变量的执行顺序
2012-12-18 11:18 1042java初始化顺序 1在new B一个实例时首先要进行类的装载 ... -
java线程同步原理(lock,synchronized)
2012-11-26 14:26 1000一。 java线程同步原理 java会为每个object对象分 ... -
总结下java中abstract,interface,final,static,加深理解
2012-11-16 17:16 893一,抽象类:abstract 1,只要有一个或一个 ... -
为什么interface的变量必须是public final static的
2012-11-16 17:15 1019public 感觉是因为Java对接口的要求是所有类都可以实现 ... -
stack在排序的应用
2012-10-22 17:04 725对于list, 可用Collections的静态方法 Coll ... -
随机访问文件RandomAccessFile 与 内存映射文件MappedByteBuffer
2012-09-25 14:59 1578RandomAccessFile RandomAccessF ... -
Java 服务器端支持断点续传的源代码
2012-09-25 14:44 4041Java 服务器端支持断点续传的源代码【支持快车、迅雷】(仅支 ... -
new File(String parent,String child)
2012-08-22 23:00 1174//user_dir:E:\workspace\javates ... -
System.getProperty
2012-08-22 22:07 915System.getProperty(String name) ...
相关推荐
总的来说,通过Java多线程和队列数据结构,我们可以有效地模拟排队叫号系统。这种模拟有助于理解和实践并发编程,同时也为我们解决实际问题提供了思路。在这个过程中,我们学习了线程同步、队列操作以及如何在Java中...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...
Java多线程技术是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程是实现并发处理的关键技术,尤其在服务器端应用和高性能计算中不可或缺。 ...
本文将深入探讨Java多线程的相关概念、线程类和接口的使用,以及线程的同步与互斥。 首先,我们需要理解进程与线程的基本概念。程序是一组静态指令的集合,而进程则是程序在执行过程中的一个实例,拥有独立的内存...
Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,多线程的实现主要通过两种方式:继承Thread类和实现Runnable接口。理解并掌握多线程的使用对于任何Java开发者...
在Java编程中,多线程是一种重要的技术,它允许程序同时执行多个任务,提升系统效率。在并发编程中,"生产者-消费者"模式是一种经典的解决问题的范式,用于协调两个或更多线程间的协作,其中一部分线程(生产者)...
在JAVA中,多线程的实现主要依赖于`Thread`类和`Runnable`接口。开发者可以通过直接继承`Thread`类或实现`Runnable`接口来创建新的线程。`Thread`类提供了线程的启动、同步和控制方法,如`start()`、`join()`和`...
Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了软件的效率和响应性。在Java中,多线程的实现主要有两种方式:通过继承Thread类和实现Runnable接口。这篇资料深入探讨了Java多线程的相关知识...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程技术尤其关键,因为它们能够充分利用多核处理器的能力。这份"Java多线程编程...
1. **线程基础**:书中首先会介绍Java多线程的基础知识,包括线程的创建方式(如通过`Thread`类或实现`Runnable`接口)、线程的生命周期(新建、就绪、运行、阻塞和死亡),以及如何启动和停止线程。 2. **线程同步...
Java多线程是Java编程语言的重要特性之一,它允许开发者在单个程序中同时运行多个部分,这些部分可以并发执行。掌握Java多线程技术对于设计高效的并发程序、充分利用多核处理器资源、提高应用程序的执行效率至关重要...
通过阅读提供的"Java多线程设计模式详解.pdf"和"Java多线程设计模式上传文件",开发者可以深入学习这些模式的原理、实现方式以及实际应用场景,从而在实际工作中更好地运用多线程设计模式,提升软件的并发性能和质量...
Java多线程是Java编程语言中的一个重要特性,它允许在单个程序中同时执行多个线程,从而提高程序的效率和响应性。本文将深入探讨Java多线程的基础概念、线程的生命周期以及一些关键的线程控制方法,如`suspend()`和`...
根据给定文件的信息,本篇文档是关于Java多线程同步技术在简易模拟售票系统中的应用研究。文档详细介绍了多线程的概念、如何在Java中创建线程、线程同步技术以及如何利用这些技术来解决共享资源访问时的数据一致性...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程可以通过实现Runnable接口或继承Thread类来创建。下面我们将深入探讨Java多线程编程的...
### Java多线程知识点解析 #### 一、Java多线程概述 Java作为一种现代编程语言,内置了对多线程的支持。多线程允许应用程序同时处理多个任务,从而提高程序的响应性和整体性能。在多线程环境中,一个程序可以包含...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的运行效率和资源利用率。本笔记全面涵盖了多线程的学习,包括基础理论和实践代码,旨在帮助开发者深入理解并掌握Java多线程技术。 一、...
Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,从而提高系统效率。本篇文章将深入探讨Java中的多线程以及线程池的使用。 在Java中,多线程主要用于处理并发任务,这包括但不限于网络通信、...
由于提供的文件内容大部分与Java多线程编程核心技术并无直接关联,而是关于电子书资源的联系方式和说明,因此不能直接从这部分内容中生成关于Java多线程的知识点。但考虑到描述中提到了电子书的标题以及它涉及的主题...