系统是如何做到,停止一个运行中的任务线程呢,我看了源码,但是发现代码里边只是给任务线程设置了一个终止标记interrupt,但是这样并不能停止正在运行的线程,除非线程中有wait,sleep等阻塞操作,希望大神给指点一下。
if (triggerParam.getExecutorTimeout() > 0) {
// limit timeout
Thread futureThread = null;
try {
FutureTask<Boolean> futureTask = new FutureTask<Boolean>(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
// init job context
XxlJobContext.setXxlJobContext(xxlJobContext);
handler.execute();
return true;
}
});
futureThread = new Thread(futureTask);
futureThread.start();
Boolean tempResult = futureTask.get(triggerParam.getExecutorTimeout(), TimeUnit.SECONDS);
} catch (TimeoutException e) {
XxlJobHelper.log("<br>----------- xxl-job job execute timeout");
XxlJobHelper.log(e);
// handle result
XxlJobHelper.handleTimeout("job execute timeout ");
} finally {
futureThread.interrupt(); //这里只是给线程打了一个停止的标记,并不会中断正在运行的任务
}
2条答案
按热度按时间w8biq8rn1#
一个任务是可以被多次触发的,中断任务是设置停止标记并标记任务线程的中断状态,并不会中断当前正在执行的任务,当前任务执行完后,将触发队列内参数回调给调度中心失败状态。
qhhrdooz2#
目前来看,如果任务的逻辑中 没有对中断标识位进行判断化,当前的任务一直到最终结束才会停止(或者说声明式的抛出异常才可以)