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