方法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等。
本文通过一个Java示例展示了如何使用synchronized关键字实现两个线程交替打印A1到Z26。即使去掉中间的sleep,线程执行顺序也可能因char转换的延迟而受影响。除了synchronized,还可以利用LockSupport、ReentrantLock+Condition等工具实现线程同步控制。
739





