首页 > 解决方案 > 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);
}

标签: javaspring

解决方案


推荐阅读