方法1:忘记从哪看的了,设计得比较繁琐。
class Num{
int i = 1;
boolean flag = false;
}
public class TestXX {
public static void main(String[] args) {
Num num = new Num();
new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<10;i++) {
synchronized (num) {
if(!num.flag) { //false 进入
try {
num.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
System.out.println(Thread.currentThread().getName()+" "+num.i);
num.i ++;
num.flag = false;
num.notify();
}
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<10;i++) {
synchronized (num) {
if(num.flag) { //true进入
try {
num.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
System.out.println(Thread.currentThread().getName()+" "+num.i);
num.i ++;
num.flag = true;
num.notify();
}
}
}
}
}).start();
}
}
方法2:原文:https://www.cnblogs.com/stateis0/p/9091254.html。我稍作修改,其形式较为简单:
public class testXXX {
public static void main(String[] args) {
Object obj = new Object();
new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<10;i++) {
synchronized (obj) {
System.out.println(Thread.currentThread().getName()+" "+i);
obj.notify();
if(i==9) {
break;
}
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<10;i++) {
synchronized (obj) {
System.out.println(Thread.currentThread().getName()+" "+i);
obj.notify();
if(i==9) {
break;
}
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
}