控制方法執行時間

能夠經過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線程

相關文章
相關標籤/搜索