LockSupport:阻塞工具类,有park(),unpark(线程)等方法
和wait(),notify()方法相比,LockSupport不需要获取对象的锁
和suspend(),resume()方法相比,LockSupport的unpark()可以在park()方法之前执行,
避免了resume()先于suspend()方法执行造成无限挂起的问题,并且使用suspend()线程挂起后,线程的状态是Runnable
而使用LockSupport,线程的状态是Waiting
Demo:
import java.util.concurrent.locks.LockSupport;
/**
* LockSupport 与 suspend,resume相比 避免了 resume发生在suspend导致线程一直挂起的问题,并且suspennd挂起,
* 线程状态是Runnable,而使用LockSupport的pard()方法,线程状态是Waiting
* LockSupport 与 wait,notify相比 LockSupport不需要对象锁
*/
public class TestLockSupport {
private static Object obj = new Object();
private static class LockSupportThread extends Thread{
public LockSupportThread(String str){
super.setName(str);
}
@Override
public void run(){
synchronized(obj) { //LockSupport 可以不需要 同步 在此只是为了 t1,t2访问同一临界区资源
LockSupport.park(); //等待 可以响应中断,中断后继续往后执行
// if(Thread.interrupted()){
// System.out.println(Thread.currentThread().getName() + "被中断了....");
// }
System.out.println(Thread.currentThread().getName() + " locked....");
}
}
}
public static void main(String[] args) throws InterruptedException {
LockSupportThread t1 = new LockSupportThread("t1");
LockSupportThread t2 = new LockSupportThread("t2");
// LockSupport.unpark(t1); //在start()方法前 t1,t2会一直等待
// LockSupport.unpark(t2);
t1.start();
Thread.sleep(1000);
t2.start();
LockSupport.unpark(t1); //可能运行在park之前 但t1,t2依旧不会一直等待 这是和suspend,resume的区别
// t1.interrupt();
LockSupport.unpark(t2);
}
}
结果显示:
t1 locked....
t2 locked....
----原案例,来源于java高并发程序设计