package concurrent.lock; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ConditionTest { /** * @param args */ public static void main(String[] args) { final Business business = new Business(); new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 50; i++) { business.sub(i); } } }).start(); for (int i = 1; i <= 50; i++) { business.main(i); } } static class Business { Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); private boolean bShouldSub = true; public void sub(int i) { lock.lock(); try { while (!bShouldSub) { try { condition.await();//使线程等待 } catch (Exception e) { e.printStackTrace(); } } for (int j = 1; j <= 10; j++) { System.out.println("sub thread sequence of " + j + ",loop of " + i); } bShouldSub = false; condition.signal(); } finally { lock.unlock(); } } public void main(int i) { lock.lock(); try { while (bShouldSub) { try { condition.await(); } catch (Exception e) { e.printStackTrace(); } } for (int j = 1; j <= 100; j++) { System.out.println("main thread sequence of " + j + ",loop of " + i); } bShouldSub = true; condition.signal();//唤醒被condition.await的线程 } finally { lock.unlock(); } } } }
下面是3个线程轮流执行的实例:
package concurrent.lock; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ThreeConditionCommunication { /** * 三个线程轮流执行 */ public static void main(String[] args) { final Business business = new Business(); new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 50; i++) { business.sub2(i); } } }).start(); new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 50; i++) { business.sub3(i); } } }).start(); for (int i = 1; i <= 50; i++) { business.main(i); } } static class Business { Lock lock = new ReentrantLock(); Condition condition1 = lock.newCondition(); Condition condition2 = lock.newCondition(); Condition condition3 = lock.newCondition(); private int shouldSub = 1; public void sub2(int i) { lock.lock(); try { while (shouldSub != 2) { try { condition2.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (int j = 1; j <= 10; j++) { System.out.println("sub2 thread sequence of " + j + ",loop of " + i); } shouldSub = 3; condition3.signal(); } finally { lock.unlock(); } } public void sub3(int i) { lock.lock(); try { while (shouldSub != 3) { try { condition3.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (int j = 1; j <= 20; j++) { System.out.println("sub3 thread sequence of " + j + ",loop of " + i); } shouldSub = 1; condition1.signal(); } finally { lock.unlock(); } } public void main(int i) { lock.lock(); try { while (shouldSub != 1) { try { condition1.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (int j = 1; j <= 100; j++) { System.out.println("main thread sequence of " + j + ",loop of " + i); } shouldSub = 2; condition2.signal(); } finally { lock.unlock(); } } } }
发表评论
-
ArrayBlockingQueue实例
2015-01-25 21:26 680package concurrent.arrayblock ... -
CurrentSkipListMap实例
2015-01-25 21:21 676package concurrent.concurrent ... -
copyOnWriteArraylist实例
2015-01-25 21:19 428package concurrent.copyOnWrit ... -
CountDownLatch计数器实例
2015-01-24 21:21 526package concurrent.countDownL ... -
CyclicBarrier路障实例
2015-01-24 21:20 531package concurrent.cyclicBarr ... -
Exchanger实例
2015-01-24 21:19 424package concurrent.exchanger; ... -
Future实例
2015-01-24 21:17 524package concurrent.Future; ... -
java实现一个简单的缓存
2015-01-24 21:15 977package concurrent.lock; i ... -
Semaphore信号灯实例
2015-01-23 23:34 439package concurrent.lock; i ... -
ReentrantReadWriteLock读写锁实例
2015-01-23 23:28 815package concurrent.lock; i ... -
ReentrantLock实例
2015-01-23 23:26 560package concurrent.lock; i ... -
四种线程池实例
2015-01-23 23:21 15631、固定线程池: package concurrent.t ...
相关推荐
- `newCondition()`: 创建一个新的Condition实例,可以用于实现线程间的精确通信。 3. **Condition类** - Condition接口允许我们创建和管理线程等待队列。每个Lock实例都可以创建一个或多个Condition实例,每个...
每个Lock对象都可以创建多个Condition实例,每个Condition对应一个单独的等待队列。 1. await():使当前线程等待,直到被其他线程唤醒或被中断。线程被唤醒后,需要重新获取锁才能继续执行。 2. signal():唤醒一个...
Java 使用 Condition 控制线程通信的方法实例详解 Java 中,Condition 类是 Lock 接口的一个补充,它提供了一种机制来让线程等待某个条件的满足,然后继续执行。Condition 将同步监视锁方法(wait、notify 和 ...
线程通信(Condition)实例,完整的代码文件,你只需要编译运行即可,就可以看看结果,然后分析。
* notEmpty和notFull:Condition实例,用于通知等待的线程 在ArrayBlockingQueue中,put方法用于将元素插入队列,take方法用于从队列中获取元素。当队列为空时,take方法会阻塞等待队列非空时,否则会将元素从队列...
但Condition与特定的Lock关联,可以创建多个Condition实例,每个实例对应不同的等待队列,这样可以实现更精细的线程同步控制。 6. **线程同步的重要性**: 在多线程环境中,同步是必要的,以防止数据不一致性和竞...
相比于Object的监视器方法,Condition提供了更大的灵活性,可以为每个Lock创建多个Condition实例,从而更好地控制线程间的协作。 Condition接口的主要方法包括: 1. await():使当前线程等待,直到被其他线程调用...
每个Lock实例可以有多个Condition实例,从而可以实现不同的等待集合。 2. **Phaser** - 在3.1版本中,backport-util-concurrent引入了Phaser,这是一个可重用的同步帮助器类,支持多个参与者之间的有界同步,类似...
6. newCondition():返回一个新的Condition实例,用于与锁对象进行协作。 ReentrantLock的特性包括: - 可重入:一个线程可以重复获取它已经持有的锁。 - 公平性:可以设置为公平锁,优先考虑在队列中等待时间最长...
在上述示例中,`QueryWrapper`是`Wrapper`的一个实现,我们可以直接实例化并调用其提供的方法来设置查询条件。`eq`表示等于,`ge`表示大于等于,`or`表示或逻辑,这些方法都是对`Condition`类的操作。 除了基本的...
4. **线程通信**:可能使用条件变量(std::condition_variable)或Windows API的WaitForSingleObject来实现线程间的通信和协调。 5. **线程结束**:当线程完成任务后,应正确地结束它们,使用std::thread的join方法...
这个"删除记录窗体实例"提供了一个直观的用户界面,允许用户选择并删除特定的记录。以下是对这个实例的一些详细说明和相关知识点: 1. **C# 窗体(Form)基础**:C#中的窗体是应用程序的可视化界面,用户通过窗体与...
String condition = weatherInfo.selectFirst(".condition").text(); Map, String> forecast = new HashMap(); forecast.put("city", city); forecast.put("temperature", temperature); forecast.put(...
在C++中,我们可以使用`std::condition_variable`、`std::promise`和`std::future`等工具来构建消息传递系统。这种机制可以让一个线程发送消息(即数据),另一个线程接收到消息后进行处理。在上述的类实例化过程中...
本压缩包中的"Oracle代码"包含了一系列关于触发器、视图等常用SQL语句的实例代码,旨在帮助用户更好地理解和应用这些概念。 首先,让我们深入了解一下触发器。在Oracle数据库中,触发器是一种特殊的存储过程,它在...
// 构造方法,用于创建条件实例 public SqlCondition(string field, Operator op, object value) { Field = field; Operator = op; Value = value; } // 用于生成SQL条件字符串的方法 public string ToSql...
本实例将深入探讨C++中实现简单任务队列的方法。任务队列,顾名思义,是用于存储待执行任务的数据结构,通常采用先进先出(FIFO)的策略来处理任务。这种设计模式可以有效地管理并发执行的任务,提高系统资源的利用...
ResultSet rs = stmt.executeQuery("SELECT * FROM table_name WHERE condition"); ``` 5. **处理结果集**:对于查询操作,我们需要遍历`ResultSet`以获取结果。 ```java while (rs.next()) { String column1 = ...
`用来插入数据,而`SELECT * FROM table_name WHERE condition;`用于查询满足特定条件的数据。 索引是提升查询性能的关键。书中会教你如何创建主键索引、唯一索引和普通索引,如`ALTER TABLE table_name ADD ...
书中会介绍Thread类和Runnable接口,线程同步机制如synchronized关键字、wait/notify、Lock和Condition,以及线程池的使用。 6. **网络编程**:Java的Socket编程允许创建基于TCP/IP的客户端和服务端应用程序,书...