奇数线程 + 偶数线程
依旧是测试 Object 类的
wait
方法和notify
方法效果:奇数线程输出奇数,偶数线程输出偶数,每次递增 1
代码:
/**
* 奇数线程 + 偶数线程
*/
public class ThreadTest13 {
public static void main(String[] args) {
Num num = new Num();
Thread t1 = new Thread(new MyThread11(num));
Thread t2 = new Thread(new MyThread12(num));
t1.setName("奇数输出线程");
t2.setName("偶数输出线程");
t1.start();
t2.start();
}
}
class Num {
int i = 1; // 不初始化的话,new 对象时默认值为0
}
class MyThread11 implements Runnable{
Num num;
public MyThread11(Num num){
this.num = num;
}
@Override
public void run() {
// 奇数线程输出奇数
while (true){
synchronized (num){
if(num.i % 2 == 0){ // 是偶数
try {
num.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 程序到这里,说明num.i是奇数
System.out.println(Thread.currentThread().getName() + "--->" + num.i++);
num.notify();
}
}
}
}
class MyThread12 implements Runnable{
Num num;
public MyThread12(Num num){
this.num = num;
}
@Override
public void run() {
while (true){
synchronized (num){
// 偶数线程输出偶数
if (num.i % 2 == 1){
try {
num.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 输出偶数
System.out.println(Thread.currentThread().getName() + "--->" + num.i++);
num.notify();
}
}
}
}
运行结果:
奇数输出线程--->1
偶数输出线程--->2
奇数输出线程--->3
偶数输出线程--->4
奇数输出线程--->5
偶数输出线程--->6
奇数输出线程--->7
偶数输出线程--->8
奇数输出线程--->9
偶数输出线程--->10
奇数输出线程--->11
偶数输出线程--->12
奇数输出线程--->13
偶数输出线程--->14
奇数输出线程--->15
偶数输出线程--->16
PS:这是一个死循环的输出,以上结果是部分结果的示例