一、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());
}
}