可以通过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