【问题标题】:java how to make asynchronous task run only when other threads not activejava如何使异步任务仅在其他线程不活动时运行
【发布时间】:2016-02-24 01:56:46
【问题描述】:

我有一个固定的线程池用于预定作业,现在我只有一个预定作业:

App.setSes(Executors.newScheduledThreadPool(1));
App.getSes().scheduleAtFixedRate(new SPCPollingTask(), 0, Integer.parseInt(SPCService.INSTANCE.getConfig("scheduleInterval")), TimeUnit.MINUTES);

还有一个用于异步任务的线程池:

App.setAes(Executors.newFixedThreadPool(10, new ThreadFactory(){
            @Override
            public Thread newThread(Runnable r) {
                Thread thread = new Thread(r);
                thread.setPriority(Thread.MIN_PRIORITY);
                return thread;
            }

        }));

SPCPollingTask,我向它提交异步任务是这样的:

if(total > 50){
            int i = 51;
            long c = System.currentTimeMillis();
            do{
                App.getAes().submit(new Async1225Task(bdhm, ccxh, accountNo, subAccountNo, beginDate, endDate, i));
                i = i + 50;
            }while(i <= total);
            long n = System.currentTimeMillis();
            ARE.getLog().debug("[perf-hint]--submit task to AES takes " + StringUtil.formatLong((n-c), "#") + " ms");
        }

通过这样做,我希望计划任务SPCPollingTask 总是会很快完成,但在我的 Windows PC 上,它几乎是在整个异步任务结束时完成的。我将代码上传到 linux 服务器并获得了更好的结果,但仍然不够好。

如何确保我计划的 SPCPollingTask 总是先完成它的工作,然后异步任务才能完成它们的工作?

我在带有 JDK6 的 Tomcat 6 上运行这些。

【问题讨论】:

  • 您是否在计划任务中提交了超过 1 个异步任务?
  • @Xipo 是的,80 个异步任务

标签: java multithreading asynchronous


【解决方案1】:

目前需要最少篡改代码的最简单方法是将在计划作业中生成的所有异步任务添加到列表中,然后在计划作业执行结束时将它们全部提交。

这很容易做到:

  1. SPCPollingTaskrun()方法的开头添加

    List<Task> tasks = new ArrayList<Task>(80);
    
  2. 将所有App.getAes().submit('any task goes here'); 替换为

    tasks.add('any task goes here');
    
  3. run方法结束

    App.getAes().invokeAll(tasks);
    

请记住invokeAll 是“阻塞”,因此您应该考虑使用循环提交列表中的所有任务

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 2016-06-18
    • 2019-06-20
    • 2022-06-11
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多