可以通过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));
}
测试以及代码获取详见: