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() {
@Override
public void run() {
for (int i = 1; i <= 50; i++) {
business.sub1Say(i);
}
}
});
// 子线程2 说50次,每次说10句话
pool.execute(new Runnable() {
@Override
public 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();
}
}
}
Java线程总结(七):并发包------线程通信condition
最新推荐文章于 2024-07-27 19:45:00 发布