方法1
//两个线程打印A1B2...Z26
public class Test05 {
public static void main(String[] args) {
final Object lock = new Object();
new Thread(() -> {
synchronized (lock) {
for (int i = 65; i < 91; i++) {
System.out.println((char)i);
lock.notify();
try {
if (i == 90) break;//最后一个不要锁了,不然程序一直阻塞
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(() -> {
synchronized (lock) {
for (int i = 1; i < 27; i++) {
System.out.println(i);
lock.notify();
try {
if (i == 26) break;//最后一个不要锁了,不然程序一直阻塞
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
疑惑:去掉中间的sleep,输出总是先数字后字母,就算先new先start也是这样,难道是char转化这里慢了?debug的时候打断点执行有时候会正常。
当然不仅仅是synchronized,其他能对线程执行进行控制控制的类也可以做到,LockSupport,ReentrantLock+Condition等。