用例1:子線程等待主線程發放許可!測試
public static void main(String[] args) { Thread thread = new Thread(){ public void run(){ System.out.println("子線程 -> 測試通行許可!"); LockSupport.park(); System.out.println("子線程 -> 已通行!"); } }; thread.start(); System.out.println("主線程 -> 休眠1秒!"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("主線程 -> 發放通行許可於子線程!"); LockSupport.unpark(thread); /* 運行結果: 主線程 -> 休眠1秒! 子線程 -> 測試通行許可! 主線程 -> 發放通行許可於子線程! 子線程 -> 已通行! */ }
用例2:主線程提早發放許可給子線程!spa
public static void main(String[] args) { Thread thread = new Thread(){ public void run(){ System.out.println("子線程 -> 休眠1秒!"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("子線程 -> 測試通行許可!"); LockSupport.park(); System.out.println("子線程 -> 已通行!"); } }; thread.start(); System.out.println("主線程 -> 提早發放通行許可於子線程!"); LockSupport.unpark(thread); /* 運行結果: 主線程 -> 提早發放通行許可於子線程! 子線程 -> 休眠1秒! 子線程 -> 測試通行許可! 子線程 -> 已通行! */ }
用例3:子線程傳遞數據給主線程。線程
public static void main(String[] args) { Thread thread = new Thread(){ public void run(){ System.out.println("子線程 -> 測試通行許可!並提供通行證:A"); LockSupport.park(new String("A")); System.out.println("子線程 -> 已通行!"); } }; thread.start(); System.out.println("主線程 -> 休眠1秒!"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("主線程 -> 檢查並處理子線程的通行證:" + LockSupport.getBlocker(thread)); System.out.println("主線程 -> 許可子線程通行!"); LockSupport.unpark(thread); /* 運行結果: 主線程 -> 休眠1秒! 子線程 -> 測試通行許可!並提供通行證:A 主線程 -> 檢查並處理子線程的通行證:A 主線程 -> 許可子線程通行! 子線程 -> 已通行! */ }
所有操做:code
主要用途:對象
當前線程須要喚醒另外一個線程,可是隻肯定它會進入阻塞,但不肯定它是否已經進入阻塞,所以無論是否已經進入阻塞,仍是準備進入阻塞,都將發放一個通行准許。blog
正確用法:get
把LockSupport視爲一個sleep()來用,只是sleep()是定時喚醒,LockSupport既能夠定時喚醒,也能夠由其它線程喚醒。io