第一种方式:
public class Print奇偶数{
private static class Counter {
public int value = 1;
public boolean odd = true;
}
private static Counter counter = new Counter();
private static class PrintOdd implements Runnable {
@Override
public void run() {
while (counter.value <= 100) {
synchronized(counter) {
if (counter.odd) {
System.out.println(counter.value);
counter.value++;
counter.odd = !counter.odd;
//很重要,要去唤醒打印偶数的线程
counter.notify();
} else {
//交出锁,让打印偶数的线程执行
try {
counter.wait();
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
}
}
}
}
}
private static class PrintEven implements Runnable {
@Override
public void run() {
while (counter.value <= 100) {
synchronized (counter) {
if (counter.odd) {
try {
counter.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println(counter.value);
counter.value++;
counter.odd = !counter.odd;
counter.notify();
}
}//synchronized
}
}
}
public static void main(String[] args) {
new Thread(new PrintOdd()).start();
new Thread(new PrintEven()).start();
}
}
第二种方式:
public class Print奇偶数{
static final Object object = new Object();
static int a = 1;
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
while (a <= 100){
if (a % 2 == 1){
System.out.println(a);
a++;
object.notify();
}else {
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}, "打印奇数").start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
while (a <= 100){
if (a % 2 == 0){
System.out.println(a);
a++;
object.notify();
}else {
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}, "打印偶数").start();
}
}