Java5 中提过了Condition ,该类可以实现线程间的条件控制,废话少说直接来看一个实例。
实例:
启动两根子线程,连同主线程一共3根线程,实现子线程1执行5次切换至子线程2执行5次,再切换至主线程执行5,然后切换至子线程1执行5次,如此往复3次,程序退出。
程序代码:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 通过Condition来实现线程间的通信
*
* @author 吖大哥
* @date May 24, 2014 6:43:26 PM
*/
public class ThreeConditionTest {
public static void main(String[] args) {
final Business1 bs = new Business1();
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 3; i++) {
bs.sub1(i);
}
}
}).start();
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 3; i++) {
bs.sub2(i);
}
}
}).start();
for (int i = 0; i < 3; i++) {
bs.sub3(i);
}
}
}
class Business1 {
private Lock lock = new ReentrantLock();
private int flag = 1;
private Condition c1 = lock.newCondition();
private Condition c2 = lock.newCondition();
private Condition c3 = lock.newCondition();
public void sub1(int i) {
lock.lock();
try {
while (flag != 1) {
try {
c1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 0; j < 5; j++) {
System.out.println("Sub1 第 " + i + " 次执行*****" + j);
}
flag = 2;
c2.signal();
} catch (RuntimeException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void sub2(int i) {
lock.lock();
try {
while (flag != 2) {
try {
c2.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 0; j < 5; j++) {
System.out.println("Sub2 第 " + i + " 次执行*****" + j);
}
flag = 3;
c3.signal();
} catch (RuntimeException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void sub3(int i) {
lock.lock();
try {
while (flag != 3) {
try {
c3.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 0; j < 5; j++) {
System.out.println("Sub3 第 " + i + " 次执行*****" + j);
}
flag = 1;
c1.signal();
} catch (RuntimeException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
执行结果:
Sub1 第 0 次执行*****0
Sub1 第 0 次执行*****1
Sub1 第 0 次执行*****2
Sub1 第 0 次执行*****3
Sub1 第 0 次执行*****4
Sub2 第 0 次执行*****0
Sub2 第 0 次执行*****1
Sub2 第 0 次执行*****2
Sub2 第 0 次执行*****3
Sub2 第 0 次执行*****4
Sub3 第 0 次执行*****0
Sub3 第 0 次执行*****1
Sub3 第 0 次执行*****2
Sub3 第 0 次执行*****3
Sub3 第 0 次执行*****4
Sub1 第 1 次执行*****0
Sub1 第 1 次执行*****1
Sub1 第 1 次执行*****2
Sub1 第 1 次执行*****3
Sub1 第 1 次执行*****4
Sub2 第 1 次执行*****0
Sub2 第 1 次执行*****1
Sub2 第 1 次执行*****2
Sub2 第 1 次执行*****3
Sub2 第 1 次执行*****4
Sub3 第 1 次执行*****0
Sub3 第 1 次执行*****1
Sub3 第 1 次执行*****2
Sub3 第 1 次执行*****3
Sub3 第 1 次执行*****4
Sub1 第 2 次执行*****0
Sub1 第 2 次执行*****1
Sub1 第 2 次执行*****2
Sub1 第 2 次执行*****3
Sub1 第 2 次执行*****4
Sub2 第 2 次执行*****0
Sub2 第 2 次执行*****1
Sub2 第 2 次执行*****2
Sub2 第 2 次执行*****3
Sub2 第 2 次执行*****4
Sub3 第 2 次执行*****0
Sub3 第 2 次执行*****1
Sub3 第 2 次执行*****2
Sub3 第 2 次执行*****3
Sub3 第 2 次执行*****4
执行过程分析: