458 Star 2.9K Fork 1.1K

GVP京东零售 / asyncTool

 / 详情

执行超时后,只是把worker的设置设置为ERROR,但worker对应的线程仍然在运行

Backlog
Bug
Opened this issue  
2020-10-16 09:32

感觉代码没有写完嘛,疑问如下: 1、超时后,虽然返回到主线程,但在线程池中创建的线程仍然在运行, 如a执行后,并发执行b,c,b,c的执行时间较长,a较快,设置超时时间为a执行的时间,执行后,发现执行B,C的线程仍然在运行,并直到运行完毕。

Attachments

Comments (8)

cloud-coder created缺陷
展开全部操作日志

只要一个线程的任务启动后,就没有任何方式能让他停下来。除非该线程的方法自己return或者执行完毕,否则任何别的线程都无法停止一个执行中的线程

在WorkerWrapper做一个执行此WorkerWrapper任务的引用,当任务超时退出时,调用对应线程的interrupt方法,如 public void stopNow() {
if (getState() == INIT || getState() == WORKING) {
fastFail(getState(), null);
execThread.interrupt();
}
} 这样做会有什么问题不?

走了stopNow后,该线程就不会再执行了

如果状态是WORKING,线程仍然会继续运行的

只要一个线程的任务启动后,就没有任何方式能让他停下来。除非该线程的方法自己return或者执行完毕,否则任何别的线程都无法停止一个执行中的线程

@tianyaleixiaowu 线程的任务启动后没法打断? Thread的interrupt() 和completableFuture.cancel(true)方法

写个代码试试就知道结果了,搞个任务执行的时间长一点,另外搞个线程去将这个耗时长的给interrupt一下,看看效果

interrupt要中断线程执行需要配合使用断点或者isInterrupted检查,在大多数情况下这都没必要吧。我们长时间的任务一般是请求接口啥的,中不中断没啥意义。

dev分支的v1.5.1-SNAPSHOP版本加入了打断工作中的线程的功能,可以试试看(暂未大规模测试过,可能会有潜在bug)

Sign in to comment

状态
Assignees
Projects
Milestones
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
Branches
Planed to start   -   Planed to end
-
Top level
Priority
Duration (hours)
确定
参与者(5)
303698 tianyalei 1578919857 5696078 tcsn site 1594960141
Java
1
https://gitee.com/jd-platform-opensource/asyncTool.git
git@gitee.com:jd-platform-opensource/asyncTool.git
jd-platform-opensource
asyncTool
asyncTool

Search