最简单的方法使用LockSupport
public static void main(String[] args) {
//要求用线程顺序打印A1B2C3...Z26
char[] c1="ABCDEFG".toCharArray();
char[] c2="1234567".toCharArray();
t1= new Thread(() -> {
for (char c : c1) {
System.out.println(c);
LockSupport.unpark(t2);
LockSupport.park(t1);
}
});
t2 = new Thread(() -> {
for (char c : c2) {
LockSupport.park(t2);
System.out.println(c);
LockSupport.unpark(t1);
}
});
t1.start();
t2.start();
}
运行结果:
方法二:
Object o=new Object();
t1=new Thread(()->{
synchronized (o){
for (char c : c1) {
System.out.println(c);
o.notify();
try {
o.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
});
t2=new Thread(()->{
synchronized (o){
for (char c : c2) {
System.out.println(c);
o.notify();
try {
o.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
});
t1.start();
t2.start();
}
这样运行会发现程序一致无法结束运行 :
代码中应该加上一句notify
t1=new Thread(()->{
synchronized (o){
for (char c : c1) {
System.out.println(c);
o.notify();
try {
o.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
o.notify();
}
});
t2=new Thread(()->{
synchronized (o){
for (char c : c2) {
System.out.println(c);
o.notify();
try {
o.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
o.notify();
}
});
t1.start();
t2.start();
}