多線程同步工具——LockSupport

用例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

  • park()/park(Object)
    等待通行准許。
  • parkNanos(long)/parkNanos(Object, long)
    在指定運行時間(即相對時間)內,等待通行准許。
  • parkUntil(long)/parkUntil(Object, long)
    在指定到期時間(即絕對時間)內,等待通行准許。
  • unpark(Thread)
    發放通行准許或提早發放。(注:無論提早發放多少次,只用於一次性使用。)
  • getBlocker(Thread)
    進入等待通行准許時,所提供的對象。

 

主要用途:對象

  當前線程須要喚醒另外一個線程,可是隻肯定它會進入阻塞,但不肯定它是否已經進入阻塞,所以無論是否已經進入阻塞,仍是準備進入阻塞,都將發放一個通行准許。blog

 

正確用法:get

  把LockSupport視爲一個sleep()來用,只是sleep()是定時喚醒,LockSupport既能夠定時喚醒,也能夠由其它線程喚醒。io

相關文章
相關標籤/搜索