怎么防止一下定时器线程堵塞 来人帮一下
mScheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try{
log.debug("定时任务执行中...");
opcConn();
Thread.sleep(1000*10);
writeOpc_multiple(cl);
opcDisconn();
}catch (Exception e){
e.printStackTrace();
}finally {
opcDisconn();
}
}
},1,Integer.parseInt(globalSetting.getGlobalvalue()), TimeUnit.MINUTES);
}
比如scheduleAtFixedRate运行周期10分钟 10分钟当前线程没有跑完 怎么取消当前线程重新运行
这个本身就是多线程的, 只要任务数不要超过线程数,就不会影响
没明白你说的 防止定时器线程堵塞 具体是什么意思,倒是你这个 opcDisconn(); 方法 在try 里面调用了,在finally 再次调用 ,这样重复调用是 业务上是有什么要求吗
整体的思路如下,还是需改根据您的实际业务进行调整,希望对您有所帮助!
@Slf4j
public class ScheduledTest {
static ScheduledThreadPoolExecutor scheduledExecutor = new ScheduledThreadPoolExecutor(10, Executors.defaultThreadFactory());
static BlockingQueue<Runnable> queue2 = new LinkedBlockingDeque<>();
static BlockingQueue<Runnable> queue = scheduledExecutor.getQueue();
public static void main(String[] args) throws ExecutionException {
scheduledExecutor.scheduleAtFixedRate(new Runner(), 1, 2, TimeUnit.SECONDS);
}
private static class Runner implements Runnable {
@Override
public void run() {
OpcConn opcConn = new OpcConn();
log.info("queue = " + queue2.size());
log.info("开始执行........");
Future future = scheduledExecutor.submit(opcConn);
try {
future.get(1, TimeUnit.SECONDS);
log.info("future 执行........");
} catch (TimeoutException e) {
log.info("timeout........");
queue2.add(new Runner());
//queue.addAll(queue2);
} catch (Exception e) {
e.printStackTrace();
} finally {
log.info("queue = " + queue2.size());
scheduledExecutor.shutdown(); // 强制终止任务
}
}
}
private static class OpcConn implements Callable {
@Override
public Boolean call() {
try {
Thread.sleep(10000);
System.out.println(new Date());
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
}