一、LockSupport有什麼用
LockSupport.park()
方法能阻塞線程,LockSupport.unpark()
方法能喚醒線程
二、LockSupport與wait()和notify() 有什麼區別
wait()
需釋放鎖,因此必須結合synchronized使用(沒有加鎖鎖時使用會拋出IllegalMonitorStateException,反例代碼如下),notify()
也要在synchronized使用,並且應該指定對象,synchronized(),wait(),notify() 操作的對象必須一致,一個synchronized()代碼塊中只能有1個線程wait
()或notify()
public class MyThread {
public static void main(String[] args) {
new Thread(() -> {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + ":" + i);
if (i == 5) {
Thread.currentThread().wait();
}
if (i == 6) {
Thread.currentThread().notify();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "線程1").start();
}
}
LockSupport.park()
與LockSupport.unpark()
可以結合synchronized
使用,也完全可以不結合synchronized
使用
LockSupport示例代碼注意看註釋
public class MyLockSupport {
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 100; i++) {
System.out.println(i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (i == 5) {
synchronized (MyLockSupport.class){
LockSupport.park();
System.out.println(Thread.currentThread().getState());}
}
}
},"線程1");
thread1.start();
LockSupport.unpark(thread1);
System.out.println(thread1.getState());
}
}