`

Condition实例

阅读更多
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();
			}
		}

	}
}

分享到:
评论

相关推荐

    java中的Lock类和Condition类.docx

    - `newCondition()`: 创建一个新的Condition实例,可以用于实现线程间的精确通信。 3. **Condition类** - Condition接口允许我们创建和管理线程等待队列。每个Lock实例都可以创建一个或多个Condition实例,每个...

    JavaLock与Condition的理解Reentran

    每个Lock对象都可以创建多个Condition实例,每个Condition对应一个单独的等待队列。 1. await():使当前线程等待,直到被其他线程唤醒或被中断。线程被唤醒后,需要重新获取锁才能继续执行。 2. signal():唤醒一个...

    Java使用Condition控制线程通信的方法实例详解

    Java 使用 Condition 控制线程通信的方法实例详解 Java 中,Condition 类是 Lock 接口的一个补充,它提供了一种机制来让线程等待某个条件的满足,然后继续执行。Condition 将同步监视锁方法(wait、notify 和 ...

    线程通信(Condition) 实例

    线程通信(Condition)实例,完整的代码文件,你只需要编译运行即可,就可以看看结果,然后分析。

    并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解

    * notEmpty和notFull:Condition实例,用于通知等待的线程 在ArrayBlockingQueue中,put方法用于将元素插入队列,take方法用于从队列中获取元素。当队列为空时,take方法会阻塞等待队列非空时,否则会将元素从队列...

    wait,notify等线程知识.pdf

    但Condition与特定的Lock关联,可以创建多个Condition实例,每个实例对应不同的等待队列,这样可以实现更精细的线程同步控制。 6. **线程同步的重要性**: 在多线程环境中,同步是必要的,以防止数据不一致性和竞...

    Java编程中实现Condition控制线程通信

    相比于Object的监视器方法,Condition提供了更大的灵活性,可以为每个Lock创建多个Condition实例,从而更好地控制线程间的协作。 Condition接口的主要方法包括: 1. await():使当前线程等待,直到被其他线程调用...

    backport-util-concurrent(2.2 /3.1)

    每个Lock实例可以有多个Condition实例,从而可以实现不同的等待集合。 2. **Phaser** - 在3.1版本中,backport-util-concurrent引入了Phaser,这是一个可重用的同步帮助器类,支持多个参与者之间的有界同步,类似...

    Java锁机制详解.pdf

    6. newCondition():返回一个新的Condition实例,用于与锁对象进行协作。 ReentrantLock的特性包括: - 可重入:一个线程可以重复获取它已经持有的锁。 - 公平性:可以设置为公平锁,优先考虑在队列中等待时间最长...

    MyBatisPlus条件构造器Condition的用法示例代码

    在上述示例中,`QueryWrapper`是`Wrapper`的一个实现,我们可以直接实例化并调用其提供的方法来设置查询条件。`eq`表示等于,`ge`表示大于等于,`or`表示或逻辑,这些方法都是对`Condition`类的操作。 除了基本的...

    多个实例同时运行 多实例编程 多线程 vc 源码

    4. **线程通信**:可能使用条件变量(std::condition_variable)或Windows API的WaitForSingleObject来实现线程间的通信和协调。 5. **线程结束**:当线程完成任务后,应正确地结束它们,使用std::thread的join方法...

    C# 删除记录窗体实例 个人实例

    这个"删除记录窗体实例"提供了一个直观的用户界面,允许用户选择并删除特定的记录。以下是对这个实例的一些详细说明和相关知识点: 1. **C# 窗体(Form)基础**:C#中的窗体是应用程序的可视化界面,用户通过窗体与...

    jsoup操作实例源码

    String condition = weatherInfo.selectFirst(".condition").text(); Map, String&gt; forecast = new HashMap(); forecast.put("city", city); forecast.put("temperature", temperature); forecast.put(...

    通过类名获取类的实例对象

    在C++中,我们可以使用`std::condition_variable`、`std::promise`和`std::future`等工具来构建消息传递系统。这种机制可以让一个线程发送消息(即数据),另一个线程接收到消息后进行处理。在上述的类实例化过程中...

    oracle数据库实例代码

    本压缩包中的"Oracle代码"包含了一系列关于触发器、视图等常用SQL语句的实例代码,旨在帮助用户更好地理解和应用这些概念。 首先,让我们深入了解一下触发器。在Oracle数据库中,触发器是一种特殊的存储过程,它在...

    SQL_CONDITION.rar_condition sql_condition sql_sql where conditi

    // 构造方法,用于创建条件实例 public SqlCondition(string field, Operator op, object value) { Field = field; Operator = op; Value = value; } // 用于生成SQL条件字符串的方法 public string ToSql...

    C++ 简单的任务队列实例

    本实例将深入探讨C++中实现简单任务队列的方法。任务队列,顾名思义,是用于存储待执行任务的数据结构,通常采用先进先出(FIFO)的策略来处理任务。这种设计模式可以有效地管理并发执行的任务,提高系统资源的利用...

    jsp 数据库操作实例

    ResultSet rs = stmt.executeQuery("SELECT * FROM table_name WHERE condition"); ``` 5. **处理结果集**:对于查询操作,我们需要遍历`ResultSet`以获取结果。 ```java while (rs.next()) { String column1 = ...

    mysql使用实例book-MySQL

    `用来插入数据,而`SELECT * FROM table_name WHERE condition;`用于查询满足特定条件的数据。 索引是提升查询性能的关键。书中会教你如何创建主键索引、唯一索引和普通索引,如`ALTER TABLE table_name ADD ...

    java JDK 实例开发宝典

    书中会介绍Thread类和Runnable接口,线程同步机制如synchronized关键字、wait/notify、Lock和Condition,以及线程池的使用。 6. **网络编程**:Java的Socket编程允许创建基于TCP/IP的客户端和服务端应用程序,书...

Global site tag (gtag.js) - Google Analytics