Closed OAbern closed 6 years ago
Hi,最近在使用您的框架时发现了这个问题,研读了线程部分的代码后,发现了问题所在。 在Runner.stop这个方法中,您使用了shutdown的方式来关闭线程池,那么正在执行任务的线程并不能接受到任何消息,而是会继续做完AbstractTask.run方法的任务,但是这个方法里面是个死循环,这样就导致了正在执行任务的线程不能正常终止!
提供两个解决思路:
采用shutdownNow暴力终止线程池,这会保证正在执行任务的线程收到一个InterruptedException,AbstractTask类及其子类需要对这个中断进行处理(不能吞掉),确保AbstractTask能相应中断并且退出while循环;
在AbstractTask类的while循环中判断Runner.state,当检测到状态为Stoped时,主动退出while循环。此处需要保证所有的任务线程都能够获取到这个状态并退出,否则当master的下一次请求到来时,将会重置任务Runner的状态,没来得及获得CPU时间片的任务线程就不会退出了~
你好,谢谢反馈,已经修复。
Hi,最近在使用您的框架时发现了这个问题,研读了线程部分的代码后,发现了问题所在。 在Runner.stop这个方法中,您使用了shutdown的方式来关闭线程池,那么正在执行任务的线程并不能接受到任何消息,而是会继续做完AbstractTask.run方法的任务,但是这个方法里面是个死循环,这样就导致了正在执行任务的线程不能正常终止!
提供两个解决思路:
采用shutdownNow暴力终止线程池,这会保证正在执行任务的线程收到一个InterruptedException,AbstractTask类及其子类需要对这个中断进行处理(不能吞掉),确保AbstractTask能相应中断并且退出while循环;
在AbstractTask类的while循环中判断Runner.state,当检测到状态为Stoped时,主动退出while循环。此处需要保证所有的任务线程都能够获取到这个状态并退出,否则当master的下一次请求到来时,将会重置任务Runner的状态,没来得及获得CPU时间片的任务线程就不会退出了~