能夠經過join的特性控制方法的執行時間java
join :當咱們調用某個線程的這個方法時,這個方法會掛起調用線程,直到被調用線程結束執行,調用線程纔會繼續執行。git
Thread thread = new Thread(() -> { try { Thread.sleep(3000L); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); },"子線程"); thread.start(); //thread插入當前線程(調用join的線程),當前線程掛起,thread運行完畢後當前線程繼續 try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("運行完畢");
注意是調用thread.join();的線程掛起(不是thread掛起),等着thread調用完畢後當前線程才繼續,看一下源碼jvm
//在Thread類中定義,說明調用的是thread對象的join方法 //假設main線程調用了thread線程的join方法 public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (millis == 0) { //main線程第一次進來,thread線程還在運行 while (isAlive()) { //這裏要注意,wait後釋放了thread對象的鎖 //⭐⭐雖然調用的thread的wait方法(本質是Object的)可是終歸是由main線程調用的wait方法,掛起的是main線程,並非thread //當thread運行完畢後,並不存在notify,jvm底層天然會調度喚醒main線程 wait(0); } } else { //控制時間的先不看 ………… } }
經過join的特性控制方法的執行時間測試
/** * 控制方法運行時間 * @param thread * @param cTime * @throws Exception */ public void monitor(Thread thread,long cTime) throws Exception { long begin = System.currentTimeMillis(); if(thread.getState() != Thread.State.NEW){ throw new Exception("Thread State Error"); } thread.start(); thread.join(cTime); if(thread.getState() != Thread.State.TERMINATED){ thread.stop(); } System.out.println("運行時間監控:"+(System.currentTimeMillis()-begin)); }
測試以及代碼獲取詳見:spa
https://gitee.com/zxporz/zxp-thread-test/blob/master/src/main/java/org/zxp/thread/communication/join/ControlTime.java線程