condition是锁的一个实例,他可以与ReentrantLock结合使用,取代jdk自行操作的synchronize,自己控制锁的条件。
以下是使用实例:
package dirk.condition;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class BoundedBuffer {
// 可重入的互斥锁
final Lock lock = new ReentrantLock();
// 表示"缓冲区没满"条件
final Condition notFull = lock.newCondition();
// 表示"缓冲区非空"条件
final Condition notEmpty = lock.newCondition();
// 存储空间
//final Object[] items = new Object[100];
final ArrayList<Object> list = new ArrayList<Object>();
final Queue<Object> queue = new LinkedList<Object>();
final int maxSize = 10;
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == maxSize)
notFull.await();
queue.offer(x);
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = queue.poll();
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
int threadCount = 5;
BoundedBuffer b = new BoundedBuffer();
for(int i=0;i<threadCount;i++)
{
if(i%2 == 0)
new PutThread(b).start();
new TakeThread(b).start();
}
}
public static class PutThread extends Thread
{
private final BoundedBuffer b;
private int put = 0;
public PutThread(BoundedBuffer b)
{
this.b = b;
}
@Override
public void run() {
try {
String data = null;
while(true)
{
data = "data" + (++put);
System.out.println(data);
b.put(data);
Thread.sleep(100);
}
} catch (InterruptedException e) {
//e.printStackTrace();
Thread.currentThread().interrupt();
}
}
}
public static class TakeThread extends Thread
{
private final BoundedBuffer b;
public TakeThread(BoundedBuffer b)
{
this.b = b;
}
@Override
public void run() {
try {
while(true)
{
System.out.println(b.take());
}
} catch (InterruptedException e) {
//e.printStackTrace();
Thread.currentThread().interrupt();
}
}
}
}
分享到:
相关推荐
Java JDK实例开发宝典是一本专注于Java开发实践的书籍,主要涵盖了JDK中的核心特性和常见工具的使用方法。在本书中,读者可以找到一系列精心设计的实例,旨在帮助开发者深入理解和熟练应用Java语言。以下是对书中...
Java 使用 Condition 控制线程通信的方法实例详解 Java 中,Condition 类是 Lock 接口的一个补充,它提供了一种机制来让线程等待某个条件的满足,然后继续执行。Condition 将同步监视锁方法(wait、notify 和 ...
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...
在Java并发编程中,`Condition`接口是Java并发包(java.util.concurrent)中的一个重要组成部分,它提供了比`synchronized`关键字更为精细的线程同步和唤醒机制。`Condition`允许我们创建多个独立的等待队列,每个...
每个Lock对象都可以创建多个Condition实例,每个Condition对应一个单独的等待队列。 1. await():使当前线程等待,直到被其他线程唤醒或被中断。线程被唤醒后,需要重新获取锁才能继续执行。 2. signal():唤醒一个...
这份"Java讲义与实例"涵盖了从基础到高级的Java编程知识,旨在帮助学习者全面理解和掌握Java技术。 讲义可能包括以下几个核心部分: 1. **Java基础**:讲解Java语言的基本语法,如变量、数据类型、运算符、流程...
在给定的“Java异常分装实例”中,我们可以学习如何创建自定义异常类、抛出和捕获异常,以及如何利用Java的异常层次结构。`exception_test`文件可能包含了一个或多个示例代码,用于演示这些概念。 首先,创建自定义...
通过实例,读者可以学习如何创建和管理线程,理解线程同步和通信的概念,如synchronized关键字、wait()和notify()方法,以及Lock接口和Condition类的使用。 5. **网络编程**:Java的Socket编程允许开发者创建网络...
Java多线程编程是Java开发中的重要组成部分,它允许...提供的源程序文件可以作为学习和调试的实例,帮助你更好地理解和掌握这些概念。在实际开发中,理解并熟练运用这些技术,能有效提高代码的并发性能,提升系统效率。
在这个"哲学家就餐:Java多线程实例图形版源代码学习"中,开发者可能通过创建线程来模拟每个哲学家的行为,并用Java的synchronized关键字或者Lock接口来管理筷子(资源)的访问。这将帮助学习者深入理解Java的同步...
- **条件变量(Condition)**:Java 5引入了java.util.concurrent包,其中的Condition接口提供了比wait/notify更灵活的线程间通信方式。条件变量允许线程在特定条件下等待,并且可以在条件满足时被精确地唤醒。 - *...
- `newCondition()`: 创建一个新的Condition实例,可以用于实现线程间的精确通信。 3. **Condition类** - Condition接口允许我们创建和管理线程等待队列。每个Lock实例都可以创建一个或多个Condition实例,每个...
WHERE condition`用于更新,`DELETE FROM table WHERE condition`用于删除。 6. **PL/SQL块**:Oracle特有的PL/SQL语言允许编写更复杂的存储过程、函数和触发器,它们可以直接处理Blob数据,提供更高级的业务逻辑...
Java Hibernate 是一个强大的对象关系映射(ORM)框架,它为Java开发者提供了便捷的数据持久化方式,使得在Java应用程序中操作数据库变得更加简单。本实例旨在介绍如何使用Hibernate进行基本的数据操作,包括自动...
本文将深入探讨“JAVA100例之实例54 使用语句预处理”的核心概念,并通过实际案例解析如何在Java中有效地运用预处理语句。 预处理语句,通常指的是宏定义(#define)和条件编译(#if, #ifdef, #ifndef, #else, #...
### JAVA工程师实例参考手册1知识点概述 #### 一、基础程序练习 ##### 1. 古典兔子问题 **知识点**: - 斐波那契数列:一个经典的数学问题,涉及递归或循环实现。 - 递归算法:通过函数调用自身的方式解决问题的...
Java 中 MongoDB 的各种操作查询的实例详解 在 Java 中使用 MongoDB 时,需要掌握各种操作查询的方法,本文档将详细介绍 Java 中 MongoDB 的各种操作查询的实例详解。 查询一条数据 在实际应用中,我们经常需要...
Java异步调用转同步方法实例详解 Java异步调用转同步方法实例详解是指在Java中将异步调用转换为同步调用的技术,主要用于解决异步调用过程中的阻塞问题。异步调用是一种非阻塞的调用方式,调用方在调用过程中,不...
Java实例详解 在Java编程语言的世界里,实例是理论知识转化为实际操作的关键步骤。通过具体的实例,我们可以更好地理解和掌握Java的特性和用法。在这个"java实例"中,我们将深入探讨Java的基础概念、语法以及常见...