xxl-job 系统是如何做到,停止一个运行中的任务线程呢

6xfqseft  于 4个月前  发布在  其他
关注(0)|答案(2)|浏览(65)

系统是如何做到,停止一个运行中的任务线程呢,我看了源码,但是发现代码里边只是给任务线程设置了一个终止标记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(); //这里只是给线程打了一个停止的标记,并不会中断正在运行的任务
						}
w8biq8rn

w8biq8rn1#

一个任务是可以被多次触发的,中断任务是设置停止标记并标记任务线程的中断状态,并不会中断当前正在执行的任务,当前任务执行完后,将触发队列内参数回调给调度中心失败状态。

qhhrdooz

qhhrdooz2#

目前来看,如果任务的逻辑中 没有对中断标识位进行判断化,当前的任务一直到最终结束才会停止(或者说声明式的抛出异常才可以)

相关问题