程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> LockSupport,locksupport詳解

LockSupport,locksupport詳解

編輯:JAVA綜合教程

LockSupport,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:主線程提前發放許可給子線程!

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
        主線程 -> 許可子線程通行!
        子線程 -> 已通行!
     */
}

 

全部操作:

  • park()/park(Object)
    等待獲得許可。
  • parkNanos(long)/parkNanos(Object, long)
    在指定運行時間(即相對時間)內,等待獲得許可。
  • parkUntil(long)/parkUntil(Object, long)
    在指定到期時間(即絕對時間)內,等待獲得許可。
  • unpark(Thread)
    可提前發放許可。(注:不管提前發放多少次,只用於一次性使用。)
  • getBlocker(Thread)
    阻塞時,所提供的對象。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved