之前看老杜 JavaSE 教程时给的题目, 当时没做出来.
今天重看新版教程时正好看到 synchronized 关键字, 突然想出解决办法了, 做个记录.
思路:
写一个类做数字提供.
写两个线程类分别做奇数输出和偶数输出. 这两个类都会带一个 数字提供类 的实例.
主方法中构造一个数字提供对象, 和两个以此数字提供对象为构造参数的线程类对象.
代码实现:
package com.javalearn.thread;
public class SwitchPrint {
public static void main(String[] args) {
Printer p = new Printer();
Thread t1 = new Thread(new PrintOdd(p));
Thread t2 = new Thread(new PrintEven(p));
t1.setName("奇数线程");
t2.setName("偶数线程");
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
}
}
class Printer {
private int i = 0;
public int getI() {
return i;
}
public int printI() {
return i++;
}
}
class PrintOdd implements Runnable {
private Printer p;
public PrintOdd(Printer p) {
this.p = p;
}
@Override
public void run() {
while (p.getI()<100) {
synchronized (p) {
if (p.getI() % 2 == 0) {
try {
p.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "打印输出: " + p.printI());
p.notify();
}
}
}
}
class PrintEven implements Runnable {
private Printer p;
public PrintEven(Printer p) {
this.p = p;
}
@Override
public void run() {
while(p.getI()<100) {
synchronized (p) {
if (p.getI() % 2 != 0) {
try {
p.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "打印输出: " + p.printI());
p.notify();
}
}
}
}