我有以下使用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);