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