在Java的多线程环境下,如果主线程最多等待子线程执行指定时间就要返回,保证不会因为执行时间过长而长时间没有响应。
一般有这么几种途径,线程本身中断,线程池超时中断,计数器等等,有如下几种方式:
Thread.join()
守护线程
线程池+FutureTask
CountDownLatch.await()
上面列出的这几种方案,都带了超时退出机制,下面我们来对比一下这几种方案
线程join
join()是Thread类中的一个方法,该方法有1个参数millis,该参数表示最多等待millis之后线程死亡。
要注意,在线程A中获得到线程B的对象,是在线程A中执行的线程B的join()方法,所以也是线程A循环执行wait()等待B线程的。
下面我们来看一下源码,看看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");
}
//0表示永久等待
if (millis == 0) {
//isAlive()判断当前线程是否存活
while (isAlive()) {
//Object.wait()方法等待获取对象锁
wait(0);
}
} else {
//isAlive()判断当前线程是否存活
while (isAlive()) {
long delay = millis - now;
//超时退出循环
if (delay <= 0) {
break;
}
//Object.wait()方法等待获取对象锁
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
isAlive()是Thread类中定义的方法,是一个native方法,用于判断当前线程是否存活
/**
* Tests if this thread is alive. A thread is alive if it has
* been started and has not yet died.
*
* @return true
if this thread is alive;
* false
otherwise.
*/
public final native boolean isAlive();
wait()是Object类中的方法,用于等待获取对象锁,