天天看点

阻塞工具类LockSupport的运用

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高并发程序设计