首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我们不应该在借来的线程上安排一个中断?

为什么我们不应该在借来的线程上安排一个中断?
EN

Stack Overflow用户
提问于 2015-10-22 02:47:29
回答 1查看 289关注 0票数 2

下面是书中Java并发的代码片段

代码语言:javascript
复制
//Scheduling an interrupt on a borrowed thread. Don’t do this.

private static final ScheduledExecutorService cancelExec = ...;

public static void timedRun(Runnable r,long timeout, TimeUnit unit) {
    final Thread taskThread = Thread.currentThread();
    cancelExec.schedule(new Runnable() {
        public void run() { taskThread.interrupt(); }
    }, timeout, unit);
    r.run();
}

作者说:

这是一种非常简单的方法,但它违反了规则:在中断线程之前,您应该知道线程的中断策略。因为可以从任意线程调用timedRun,所以它无法知道调用线程的中断策略。如果任务在超时之前完成,中断调用timedRun的线程的取消任务可能会在timedRun返回给调用者之后消失。我们不知道当这种情况发生时将运行哪些代码,但结果并不好。(通过使用计划返回的ScheduledFuture来取消取消任务,消除这一风险是可能的,但却是令人惊讶的棘手。) 此外,如果任务对中断没有响应,timedRun将在任务完成之前不会返回,这可能是在所需的超时之后很长时间(甚至根本没有)。在指定时间之后不返回的定时运行服务可能会激怒其调用方。

我的问题:

  1. 超时是什么意思?
  2. 什么是取消任务
EN

回答 1

Stack Overflow用户

发布于 2015-10-22 02:53:16

超时意味着taskThread有一个分配的时间间隔来在任务被中断之前运行它。取消任务是执行中断的专用任务(在单独的线程上)。

这里的危险是:

  • 代码正在中断线程,而不是取消任务。被中断的线程可能是线程池的一部分,并且可能已经完成了任务,并且处于完全不同的任务的中间。
  • 被中断的任务可能没有适当地使用中断作为完成其工作的指示符,或者如果它无法检查中断状态时可能会执行阻塞I/O之类的操作,因此通常无法保证超时是有效的。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33272581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档