publicclassSleepTest01 { privatestatic final Lock lock = new ReentrantLock();
publicstaticvoidmain(String[] args) { // 线程A Thread threadA = new Thread(() -> { // 获取独占锁 lock.lock(); try { System.out.println("Thread A is in sleep"); Thread.sleep(2500); System.out.println("Thread A is in awaked"); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } });
// 线程B Thread threadB = new Thread(() -> { // 获取独占锁 lock.lock(); try { System.out.println("Thread B is in sleep"); Thread.sleep(2500); System.out.println("Thread B is in awaked"); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } });
threadA.start(); threadB.start(); } }
以上代码无论执行多少次,总是A或者B先执行,并不会出现A和B交替运行的情况。
下面的代码演示了子线程在睡眠期间被主线程打断的情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
publicclassSleepTest02{ publicstaticvoidmain(String[] args)throws InterruptedException { Thread thread = new Thread(() -> { try { System.out.println("Sub thread is in sleep"); Thread.sleep(5000); System.out.println("Sub thread is in awaked"); } catch (InterruptedException e) { e.printStackTrace(); } }); thread.start(); // 子线程执行 Thread.sleep(2000); // 主线程睡眠2000ms thread.interrupt(); // 终端子线程 } }
其执行结果如下:
1 2 3 4 5
Sub thread is in sleep java.lang.InterruptedException: sleep interrupted at java.base/java.lang.Thread.sleep(Native Method) at cn.tgq007.sleep.SleepTest02.lambda$main$0(SleepTest02.java:13) at java.base/java.lang.Thread.run(Thread.java:831)
threadA.start(); threadB.start(); System.out.println("Wait for all sub thread done!"); threadA.join(); threadB.join(); System.out.println("continuing"); } }
其运行结果如下:
1 2 3 4
Wait for all sub thread done! Thread B done! Thread A done! continuing