Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我们不在借用的线程上安排一个中断呢?_Java_Multithreading_Timeout_Cancellation_Interruption - Fatal编程技术网

Java 为什么我们不在借用的线程上安排一个中断呢?

Java 为什么我们不在借用的线程上安排一个中断呢?,java,multithreading,timeout,cancellation,interruption,Java,Multithreading,Timeout,Cancellation,Interruption,以下是《Java并发实践》一书中的片段: 作者说: 这是一个看似简单的方法,但它违反了规则:你 在中断线程之前,应该知道线程的中断策略。 因为timedRun可以从任意线程调用,所以它无法知道 调用线程的中断策略如果任务在 超时,取消任务,该任务中断 timedRun被调用,可以在timedRun返回其 呼叫者我们不知道发生这种情况时会运行什么代码,但是 结果不会好的。(这是可能的,但出人意料的棘手 通过使用ScheduledFuture返回的ScheduledFuture消除此风险 以取消取消

以下是《Java并发实践》一书中的片段:

作者说:

这是一个看似简单的方法,但它违反了规则:你 在中断线程之前,应该知道线程的中断策略。 因为timedRun可以从任意线程调用,所以它无法知道 调用线程的中断策略如果任务在 超时取消任务,该任务中断 timedRun被调用,可以在timedRun返回其 呼叫者我们不知道发生这种情况时会运行什么代码,但是 结果不会好的。(这是可能的,但出人意料的棘手 通过使用ScheduledFuture返回的ScheduledFuture消除此风险 以取消取消任务。)

此外,如果任务对中断没有响应,timedRun将 直到任务完成后才返回,这可能在任务结束后很久 期望的超时(甚至根本不需要)。一个定时运行服务,它不会 在指定时间后返回很可能会刺激其性能 来电者

我的问题是:

  • 超时是什么意思
  • 什么是取消任务

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

    这里的危险是:

    • 代码是中断线程而不是取消任务。被中断的线程可能是线程池的一部分,并且可能已经完成了任务并且处于一些完全不同的任务的中间。

    • 被中断的任务可能没有适当地将中断用作完成其工作的指示器,或者可能正在执行诸如阻塞I/O之类的操作,而无法检查中断状态,因此通常无法保证超时有效

    我认为“超时意味着线程有一个分配给线程运行的时间间隔”应该是“超时意味着任务有一个分配给线程运行的时间间隔”。分配的是什么?
    //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();
    }