ReentrantLock与Condition结合使用
线程之间协作:子线程循环2次,接着主线程循环4次, 接着又回到子线程循环2次,接着再回到主线程又循环4次,如此循环5次。
/*
* System Abbrev :
* system Name :
* Component No :
* Component Name:
* File name :ThreadTest2.java
* Author :Qiuzhping
* Date :2016年9月4日
* Description : <description>
*/
/* Updation record 1:
* Updation date :2016年9月4日
* Updator :Qiuzhping
* Trace No: <Trace No>
* Updation No: <Updation No>
* Updation Content: <List all contents of updation and all methods updated.>
*/
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;
/**
* <Description functions in a word>
* 子线程循环2次,接着主线程循环4次,
* 接着又回到子线程循环2次,接着再回到主线程又循环4次,如此循环5次
* <Detail description>
*
* @author Qiuzhping
* @version [Version NO, 2016年9月4日]
* @see [Related classes/methods]
* @since [product/module version]
*/
public class ThreadTest2 {
private static Lock lock = new ReentrantLock();
private static Condition subCondition = lock.newCondition();
private static boolean subFlag = false;
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(3);
threadPool.execute(new Runnable() {
public void run() {
for (int i = 0; i < 5; i++) {
lock.lock();
try {
if (subFlag) {
subCondition.await();
}
for (int j = 0; j < 2; j++) {
System.out.println(Thread.currentThread().getName()
+ ":i=" + i + ",j=" + j);
}
subFlag = true;
subCondition.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
});
threadPool.shutdown();
for (int i = 0; i < 5; i++) {
lock.lock();
try {
if (!subFlag) {
subCondition.await();
}
for (int j = 0; j < 4; j++) {
System.out.println(Thread.currentThread().getName() + ":i="
+ i + ",j=" + j);
}
subFlag = false;
subCondition.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
}