myzhan / locust4j

Locust4j is a load generator for locust, written in Java.
MIT License
81 stars 30 forks source link

当master发出stop命令时,任务线程无法终止 #1

Closed OAbern closed 6 years ago

OAbern commented 6 years ago

Hi,最近在使用您的框架时发现了这个问题,研读了线程部分的代码后,发现了问题所在。 在Runner.stop这个方法中,您使用了shutdown的方式来关闭线程池,那么正在执行任务的线程并不能接受到任何消息,而是会继续做完AbstractTask.run方法的任务,但是这个方法里面是个死循环,这样就导致了正在执行任务的线程不能正常终止!

提供两个解决思路:

  1. 采用shutdownNow暴力终止线程池,这会保证正在执行任务的线程收到一个InterruptedException,AbstractTask类及其子类需要对这个中断进行处理(不能吞掉),确保AbstractTask能相应中断并且退出while循环;

  2. 在AbstractTask类的while循环中判断Runner.state,当检测到状态为Stoped时,主动退出while循环。此处需要保证所有的任务线程都能够获取到这个状态并退出,否则当master的下一次请求到来时,将会重置任务Runner的状态,没来得及获得CPU时间片的任务线程就不会退出了~

myzhan commented 6 years ago

你好,谢谢反馈,已经修复。