scheduleAtFixedRate定时器怎么防止线程堵塞

怎么防止一下定时器线程堵塞 来人帮一下


  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 再次调用 ,这样重复调用是 业务上是有什么要求吗

你好,可以参考这篇:

解决定时器同一时刻执行多条任务时阻塞问题_bug_chen_xue的博客-CSDN博客 解决定时器同一时刻执行多条任务时阻塞问题普通的定时任务,会一个一个执行,当同一时间有多个定时任务启动并且含有数据量比较大的任务时,会阻塞其他的定时任务,这样会产生一系列的问题;解决办法:将定时任务放入线程池配置如下:1、添加全局@EnableAsync 注解,开启对异步的支持@EnableAsync //开启对异步的支持@Componentpublic class sopServiceRecoveryController {}2、添加@Async 注解,将该定时任务设置成异步执行 @ https://blog.csdn.net/bug_chen_xue/article/details/109532155?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link

整体的思路如下,还是需改根据您的实际业务进行调整,希望对您有所帮助!

@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;
        }
    }

}