中断不会中断线程,被迫停止

时间:2013-07-04 05:54:17

标签: java multithreading threadpool interrupt interrupt-handling

要求:我首先说明我的要求以及我是如何处理它的。本来应该对后端系统进行3次调用,但无法承受顺序调用,因为它们需要花费太长时间才能破坏SLA。

解决方案:我使用ExecutorService创建了3个线程,并为它们分别提供了3个不同的任务。

final ExecutorService service = Executors
                .newFixedThreadPool(NUMBEROFTHREADSTOSPAWNSIZE);
                getSubsFutureCall = service
                        .submit(new GetSubsCallable(request));
                getAccountDetailCall = service
                        .submit(new GetAccountInfoCallable(request));
                getProvisioningCall = service
                        .submit(new GetProvisioningFromCallable(request));
                responseGetSubs = getSubsFutureCall
                        .get(TIMEOUT_IN_MILLISECONDS, TimeUnit.MILLISECONDS);
                responseGetAccountDetail = getAccountDetailCall
                        .get(TIMEOUT_IN_MILLISECONDS, TimeUnit.MILLISECONDS);
                responseFromCPF = (SubscriptionType) getProvisioningCPFCall
                        .get(TIMEOUT_IN_MILLISECONDS, TimeUnit.MILLISECONDS);

结果问题:即使在超时之后,生成的线程仍继续运行,这是不可取的。因此,我引入了一个监视线程,它获取正在运行的线程列表并中断它们。

for (Thread t : timeoutList) {      
   t.interrupt();
}

此中断无效!!!

我记得在另一个项目中做过类似的事情,它的工作非常精彩。我们的操作系统是OSX(Apple Mac)。现在,我正在使用Windows操作系统。这可能是问题吗?

无奈之下,我补充道:

for (Thread t : timeoutList) {
   t.interrupt();
   if(!t.isInterrupted() || t.isAlive()){
      t.stop();
   }
}

有人可以告诉我该怎么做以避免调用t.stop()方法以及为什么t.interrupt调用不起作用?

1 个答案:

答案 0 :(得分:0)

根据此文档:http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#interrupt(),如果线程未被阻塞且您在其上调用中断,则除了设置状态标志“中断”之外没有任何反应。

所以你必须处理线程方面的中断:

for (int i = 0; i < inputs.length; i++) {
    heavyCrunch(inputs[i]);
    if (Thread.interrupted()) {
        // We've been interrupted: no more crunching.
        return;
    }
}

您可以在此处找到更多示例:

http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html