Java线程总结(七):并发包------线程通信condition
来源:互联网 发布:俄罗斯经济知乎 编辑:程序博客网 时间:2024/05/29 08:34
package com.ydj;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 conditionTest {public static void main(String[] args) {ExecutorService pool = Executors.newFixedThreadPool(2);final Business business = new Business();// 子线程1 说50次,每次说10句话pool.execute(new Runnable() {@Overridepublic void run() {for (int i = 1; i <= 50; i++) {business.sub1Say(i);}}});// 子线程2 说50次,每次说10句话pool.execute(new Runnable() {@Overridepublic void run() {for (int i = 1; i <= 50; i++) {business.sub2Say(i);}}});// 主线程 说50次,每次说50句话for (int i = 1; i <= 50; i++) {business.mainSay(i);}}}class Business {Lock lock = new ReentrantLock();Condition subCondition1 = lock.newCondition();Condition subCondition2 = lock.newCondition();Condition mainCondition = lock.newCondition();// 当前说话线程的标志private int sayNum = 1;/** * sayNum==1时,子线程1说10句话,否则等待 * @param @param i * @return void * @throws * @author yuandejin * @date 2016-9-13 */public void sub1Say(int i) {try {lock.lock();while (sayNum != 1) {try {subCondition1.await();// 等待} catch (InterruptedException e) {e.printStackTrace();}}for (int j = 1; j <= 10; j++) {System.out.println("子线程1: 第" + i + "次,说第 " + j + "句话!");if (j == 10)System.out.println("----------------------");}sayNum = 2;subCondition2.signal();// 通知子线程2执行} finally {lock.unlock();}}/** * sayNum==2时,子线程2说10句话,否则等待 * @param @param i * @return void * @throws * @author yuandejin * @date 2016-9-13 */public void sub2Say(int i) {try {lock.lock();while (sayNum != 2) {try {subCondition2.await();// 等待} catch (InterruptedException e) {e.printStackTrace();}}for (int j = 1; j <= 10; j++) {System.out.println("子线程2: 第" + i + "次,说第 " + j + "句话!");if (j == 10)System.out.println("----------------------");}sayNum = 3;mainCondition.signal();// 通知主线程执行} finally {lock.unlock();}}/** * sayNum==3时,主线程说50句话,否则等待 * @param @param i * @return void * @throws * @author yuandejin * @date 2016-9-13 */public void mainSay(int i) {try {lock.lock();while (sayNum != 3) {try {mainCondition.await();// 等待} catch (InterruptedException e) {e.printStackTrace();}}for (int j = 1; j <= 50; j++) {System.out.println("主线程: 第" + i + "次,说第 " + j + "句话!");if (j == 50)System.out.println("----------------------");}sayNum = 1;subCondition1.signal();// 通知子线程1执行} finally {lock.unlock();}}}
0 0
- Java线程总结(七):并发包------线程通信condition
- Java并发之线程间的通信Condition
- Java线程总结(五):并发包------线程池Executors
- Java线程总结(六):并发包------线程同步Lock
- JAVA 并发编程-线程同步通信技术(Lock和Condition)(十)
- JAVA 并发编程-线程同步通信技术(Lock和Condition)(十)
- Java线程之Condition高效线程通信
- 并发编程七:线程通信
- Java并发(九)Condition和线程顺序执行
- Java线程总结(九):并发包------控制并发线程数Semaphore
- Java线程总结(十一):并发包------CyclicBarrier
- Java线程总结(十二):并发包------CountDownLatch
- java 之 Condition 线程间通信
- JAVA多线程---Condition使用---线程通信
- java使用condition进行线程通信
- java 线程通信Lock和condition接口
- JDK5 condition线程通信
- Condition使用---线程通信
- WSDL学习
- 上传图片找不到临时文件夹
- hihoCoder 题目1 : 网络流一·Ford-Fulkerson算法
- 相机拍照功能之权限和Android版本问题
- h5py/api_compat.h:27:18: error: hdf5.h: No such file or directory
- Java线程总结(七):并发包------线程通信condition
- 372.Delete Node in the Middle of Singly Linked List-在O(1)时间复杂度删除链表节点(容易题)
- Java中使用Jedis操作Redis
- [html5]轮播文字/图片
- LeetCode--66. Plus One
- Cookie实现记录上一次的登陆时间以及删除Cookie
- 直接选择排序
- latex 常见错误提示及原因简析
- ArcGIS for Server的SOE开发思路解析