【发布时间】: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