0

要求:我将首先说明我的要求以及我是如何克服它的。我应该对后端系统进行 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 调用不起作用?

4

1 回答 1

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

于 2013-07-04T05:59:18.130 回答