三条线程,一条线程打印0,一条打印奇数,一条打印偶数,比如01020304…
代码如下:
public class MyThread {
private int number = 1;
public static void main(String[] args) {
MyThread myThread = new MyThread();
new Thread(myThread::print, "0").start();
new Thread(myThread::print, "奇数").start();
new Thread(myThread::print, "偶数").start();
}
void print() {
while (true){
synchronized (this){
String name = Thread.currentThread().getName();
if(("0".equals(name) && number % 2 == 0)
|| (!"0".equals(name) && number % 2 != 0)
|| ("奇数".equals(name) && number / 2 % 2 == 0)
|| ("偶数".equals(name) && number / 2 % 2 != 0)){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
System.out.println("0".equals(name) ? ++number % 2 : ++number / 2);
this.notifyAll();
}
}
}
}
}
或者
public class MyThread {
private int num = 1;
public static void main(String[] args) {
MyThread myThread = new MyThread();
new Thread(myThread2::zero).start();
new Thread(myThread2::even).start();
new Thread(myThread2::odd).start();
}
void zero() {
while (true) {
synchronized (this) {
if (num % 2 != 0) {
System.out.println(++num % 2);
this.notifyAll();
} else {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
void even() {
while (true) {
synchronized (this) {
if (num / 2 % 2 != 0 && num % 2 == 0) {
System.out.println(++num / 2);
this.notifyAll();
} else {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
void odd() {
while (true) {
synchronized (this) {
if (num / 2 % 2 == 0 && num % 2 == 0) {
System.out.println(++num / 2);
this.notifyAll();
} else {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}