传统线程通讯执行过程中的通信是通过Object类的wait()、notify()、notifyAll()方法来实现的,下面我们通过一个案例来学习一下这些方法。
案例:
假设现在存在两个线程,主线程main与一个子线程,首先子线程执行5次,然后切换到主线程执行10次,再切换至子线程执行5次,主线程执行10次,如此各循环3次。
程序代码如下:
/**
*
* @author 吖大哥
* @date May 24, 2014 5:08:12 PM
*/
public class ConditionTest {
public static void main(String[] args) {
final Business2 b = new Business2();
// 启动线程1 执行20次
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 3; i++) {
b.sub1(i);
}
}
}).start();
for (int i = 0; i < 3; i++) {
b.main2(i);
}
}
}
class Business2 {
private boolean action = true;
public synchronized void sub1(int once) {
while (!action) {//
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < 5; i++) {
System.out.println("Sub1 " + once + " runing *********" + i);
}
action = false;
this.notify();
}
public synchronized void main2(int once) {
while (action) {//
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < 10; i++) {
System.out.println("Main2 " + once + " runing *********" + i);
}
action = true;
this.notify();
}
}
输出结果:
Sub1 0 runing *********0
Sub1 0 runing *********1
Sub1 0 runing *********2
Sub1 0 runing *********3
Sub1 0 runing *********4
Main2 0 runing *********0
Main2 0 runing *********1
Main2 0 runing *********2
Main2 0 runing *********3
Main2 0 runing *********4
Main2 0 runing *********5
Main2 0 runing *********6
Main2 0 runing *********7
Main2 0 runing *********8
Main2 0 runing *********9
Sub1 1 runing *********0
Sub1 1 runing *********1
Sub1 1 runing *********2
Sub1 1 runing *********3
Sub1 1 runing *********4
Main2 1 runing *********0
Main2 1 runing *********1
Main2 1 runing *********2
Main2 1 runing *********3
Main2 1 runing *********4
Main2 1 runing *********5
Main2 1 runing *********6
Main2 1 runing *********7
Main2 1 runing *********8
Main2 1 runing *********9
Sub1 2 runing *********0
Sub1 2 runing *********1
Sub1 2 runing *********2
Sub1 2 runing *********3
Sub1 2 runing *********4
Main2 2 runing *********0
Main2 2 runing *********1
Main2 2 runing *********2
Main2 2 runing *********3
Main2 2 runing *********4
Main2 2 runing *********5
Main2 2 runing *********6
Main2 2 runing *********7
Main2 2 runing *********8
Main2 2 runing *********9