控制方法执行时间

时间:2023-02-04 18:12:17

可以通过join的特性控制方法的执行时间

join :当我们调用某个线程的这个方法时,这个方法会挂起调用线程,直到被调用线程结束执行,调用线程才会继续执行。

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调用完毕后当前线程才继续,看一下源码

//在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));
    }

测试以及代码获取详见:

https://gitee.com/zxporz/zxp-thread-test/blob/master/src/main/java/org/zxp/thread/communication/join/ControlTime.java