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
原创粉丝点击