使用信号量来停止计时器中的线程执行

时间:2017-07-31 12:47:44

标签: java thread-safety scheduledexecutorservice

我有以下使用ScheduledExecuterService的java代码。基本上,在这个方法中有两个重要的调用:1。integrationMonitor.Processor(...)和2. runIntegrationSynching()方法。

调度程序将确保这些方法根据时间间隔执行。然而,最近我遇到了这两种方法处理时间很长的问题。如果用户然后将定时器间隔设置得太低,则下一个处理周期将开始,甚至在前一个处理周期结束之前。

这里有人建议我使用信号量来进行同步,我做了 - 它适用于我的一个测试用例,但不适用于另一个测试用例。

我正在使用信号量来阻止新的计划周期开始,前一个计划周期仍然很忙。如何知道线程何时完成才能释放信号量?

以下是代码:

static Semaphore semaphore = new Semaphore(1);
final ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleWithFixedDelay(new Runnable() {

@Override
public void run() {

    try {
      semaphore.acquire();
    catch(InterruptedException e1) {}

    runIntegrationSynching();

    try {
      semaphore.release();
    } catch(InterruptedException e1) {}

    Thread thread = new Thread(){
        public void run(){
            IntegrationMonitor intgrationMonitor = new IntegrationMonitor();
            try {
              semaphore.acquire();
            } catch(InterruptedException e1) {}

            intgrationMonitor.Processing(configXML, rcHost, alarmMonitorMap, blocker);
            try {
              semaphore.release();
            } catch(InterruptedException e1) {}
            if(intgrationMonitor != null){
                intgrationMonitor = null;
            }
        }
    };

    LOGGER.info("Attempting to start the thread for RC " + rcHost + ". Thread ID:" + thread.getId());
    thread.start();

}   
},2,2,TimeUnit.MINUTES);

0 个答案:

没有答案