java - ExecutorService 上的 ShutdownNow 无法正常工作
问题描述
我正在编写一个 Spring Boot 应用程序来模拟系统日志的事件生成器。通过休息呼叫,我必须开始事件生成,而通过另一个休息呼叫,我必须停止它。为了实现这一点,我在 Runnable 内创建了一个带有 for 循环的单个线程的 ExecutorService,但它根本没有停止。我试图在 shutdownNow() 之后用 Thread.currentThread().isInterrupted 打破 for 循环,但似乎它没有将 IsInterrupted 设置为 true。如果我使用循环布尔值,当然循环停止,但我无法创建带有 500 服务器错误的新线程。
那是我的代码:
@Service
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class EventService {
final static Logger logger = LoggerFactory.getLogger(EventService.class);
private ConfigReader configReader;
private static ExecutorService executor = Executors.newFixedThreadPool(2);
private EventsGenerator eventsGen;
private String test;
public EventService(ConfigReader configReader) {
this.configReader = configReader;
}
public void init(byte[] fileConfig) throws IOException {
configReader.read(fileConfig);
eventsGen = new EventsGenerator(configReader,configReader.getConfig().getProtocol());
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
eventsGen.stop();
try {
executor.awaitTermination(10, TimeUnit.SECONDS);
} catch (InterruptedException e) {
logger.error(e.getMessage());
}
}
});
executor.execute(eventsGen);
executor.shutdown();
/*
try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS );
} catch (InterruptedException e) {
logger.error(e.getMessage());
}
*/
}
public void shutdownService() {
eventsGen.stop();
executor.shutdownNow();
}
}
eventsGenerator 的运行方法:
@Override
public void run() {
//other things
int it;
for(i=0;i<max;i++) {
try {
if(Thread.currentThread().isInterrupted()) {
break;
}
if(!loop){
break;
}
NStringTemplate template = getNextTemplate();
String message = template.buildString(context);
if(config.getEndTime() != null) {
Date currentTime = context.getTime(false);
if(currentTime.after(config.getEndTime())) {
logger.info("L'endTime è stato superato");
break;
}
}
//other business logic
}catch(Exception exc){}
}
public void stop(){
setLoop(false);
}