java子线程断点中断不了_多线程超时中断

在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类中的方法,用于等待获取对象锁,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值