并发(十三):线程都可以中断吗?

在长任务的运行过程中,有时我们需要提前中断任务的执行,以保持对用户操作的响应性,而在新版JAVA中,已没有能终止线程执行的方法(Thread.stop()已废除),在Thread提供的内置方法中,能影响Thread执行节奏的方法也就只有interrupt()了,那么所有的线程都能对中断进行响应吗?

看如下的例子:

static class PrimeThread extends Thread {

    public void run() {
        try {
            //  无限循环
            while(true) {
                //  处理具体的业务
                Thread.yield();
            }
        } finally {
            //  只要有异常,则进入此执行步骤
            System.out.println("线程已终结");
            System.exit(0);
        }

    }

}

启动线程与中断的代码如下:

PrimeThread pt = new PrimeThread();
pt.start();
System.out.println("准备中断!");
//  中断线程
pt.interrupt();

在上面的例子中,虽然我们调用了interrupt()方法,但线程始终都无法响应中断请求,原因在于我们的业务代码都是无法响应中断请求的。

换种说法,主要是我们代码中的Thread.yield()没有抛出中断异常,换为Thread.sleep()则可以正常处理中断请求,这也是Thread.yield()与Thread.sleep()的另一个区别。

另外需要注意的是,即使我们的代码能够响应中断,但在一次循环没有完成之前,或者说没有执行到能够响应中断的指令位置,依旧无法响应中断。

结论

Thread.interrupt只是为线程增加了中断状态,还需要我们进行手动处理,更重要的是,我们调用的代码还必须支持中断状态的响应(能捕获中断异常,请参见本例中Thread.yield()与Thread.sleep()的差异),另外,从上面的例子可以看出,如果能让线程抛出异常,也是中断线程的一种方法,如提前调用InputStream的close()方法。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值