/ / java как да направите асинхронна задача да работи само когато други теми не са активни - java, multithreading, asynchronous

java как да направите асинхронна задача да работи само когато други теми не са активни - java, multithreading, asynchronous

Имам фиксирана група конец за планирана работа, сега имам само една зададена работа:

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 винаги ще завършва много бързо, но на моя прозорец на компютъра, той свърши почти в края на цялата асинхронна задача. Качих кода си на сървър на Linux и получих по-добър резултат, но все още не е достатъчно добър.

Как мога да се уверя, че съм планиран SPCPollingTask винаги ще свършат работа първо, асинхронните задачи могат да свършат работата си?

Аз ги пускам на Tomcat 6 с JDK6.

Отговори:

0 за отговор № 1

Най - лесният начин точно сега, че ще изискванай-малкото манипулиране на кода ви е да добавите всички задачи за синхронизиране, генерирани в зададената задача, в списък и след това да ги изпратите всички в края на изпълнението на планираните задания.

Това лесно се прави:

  1. В началото на твоя run() метод на SPCPollingTask просто добавете

    List<Task> tasks = new ArrayList<Task>(80);
    
  2. Заменете всички App.getAes().submit("any task goes here"); с

    tasks.add("any task goes here");
    
  3. В края на метода на изпълнение

    App.getAes().invokeAll(tasks);
    

Имайте предвид това invokeAll блокира "", така че трябва да обмислите предаването на всички задачи в списъка с помощта на цикъл