java併發:LockSupport

一個好用的東西.阻塞和釋放線程用的.

先看代碼:

 public static void aaa() {
		 System.out.println("阻塞開始");
		 LockSupport.park();
		 System.out.println("111");
 }

park()就是執行線程一直阻塞,111根本不會執行.

再看這個代碼:

 public static void aaa() {
		 System.out.println("阻塞開始");
		 LockSupport.unpark(Thread.currentThread());
		 LockSupport.park();
		 System.out.println("111");
	 }

這個111是會執行的.

原理:

LockSupport和關聯的每一個線程都有一個許可permit.這個許可permit只有0 和1 兩個值.默認是0.

unpark ---> permit =1;
park  ----> if (permit == 0){
                阻塞
            } 
            if (permit  ==1){
                permit = 0;
            }

也就是說,

1.無論如何unpark會將permit設置爲1.

2.如果permit = 0,線程阻塞.

3.如果permit =1 ,park會將permit = 0

看看下面這個發令槍的小案例吧.和countDownLatch有些類似.

public static void aaa() throws InterruptedException {
		Thread t = new Thread(new Runnable() {

			@Override
			public void run() {
				System.out.println("ready!!!");
				LockSupport.park();//阻塞
				System.out.println("go!!!!");
			}
		});
		t.start();// 啓動時阻塞

		// 3秒後執行發放通行證
		Thread.sleep(3000);
		LockSupport.unpark(t);
	}

處於park狀態的線程怎麼離開park狀態?javadoc如是說:

1.被unpark

2.被interrupts

3.虛假返回??

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章