0

В соответствии с Java Спецификации: public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) «создает пул потоков, которые могут планировать команды для запуска после заданной задержки или периодически выполнять.»метод Исполнителей Factory newScheduledThreadPool всегда возвращает тот же пул потоков

Но по моему опыту, даже если я создаю два отдельных ScheduledExecutorService, вызывая метод фабрики newScheduledThreadPool(int corePoolSize) дважды и планируя две совершенно разные задачи, связанные с записью, оба потока работают синхронно, то есть один ждет друг друга. Учитывая, что были созданы два отдельных пула потоков, они запускались одновременно.

public static ScheduledExecutorService SCANNER_SERVICE = Executors.newScheduledThreadPool(10); 
public static ScheduledExecutorService UNSERVICERESTORED_SCANNER_SERVICE = Executors.newScheduledThreadPool(10); 

Scanner scanner=new Scanner(); 
UnServiceRestoredTicketScanner unServiceRestoredTicketScanner=new UnServiceRestoredTicketScanner(); 

if(SCANNER_SERVICE.isShutdown()) 
    SCANNER_SERVICE=Executors.newScheduledThreadPool(10); 
SCANNER_SERVICE.scheduleWithFixedDelay(scanner, 0, 30, TimeUnit.SECONDS); 


if(UNSERVICERESTORED_SCANNER_SERVICE.isShutdown()) 
    UNSERVICERESTORED_SCANNER_SERVICE=Executors.newScheduledThreadPool(10); 
UNSERVICERESTORED_SCANNER_SERVICE.scheduleWithFixedDelay(unServiceRestoredTicketScanner, 0, 40, TimeUnit.SECONDS); 

Выход:

Scanner Thread started - [email protected] 
ServiceRestoredTicketScanner Thread started - com.csp.produ[email protected]15ed659 
Thread ended - [email protected] 
Scanner Thread started - [email protected] 
ServiceRestoredTicketScanner Thread ended - com.csp.produ[email protected]15ed659 
Thread ended - [email protected] 
Scanner Thread started - [email protected] 
ServiceRestoredTicketScanner Thread started - com.csp.productionsupport.queuemonitor.events.UnServiceRe[email protected] 
Thread ended - [email protected] 
Scanner Thread started - [email protected] 
ServiceRestoredTicketScanner Thread ended - com.csp.produ[email protected]15ed659 
Thread ended - [email protected] 
+0

Итак, я предполагаю, что вторая задача заканчивается aprox. 70 секунд после планирования? – Antoniossss

+2

FYI: Вы планируете задачу _same_ здесь в обоих пулах. Могут ли они совместно использовать блокировку, которая блокирует их запуск одновременно. Потому что я заверяю вас, что они работают в разных потоках. – Gray

ответ

4

Есть много вещей неправильно с вашим кодом и понимание того, как работают вещи.

Первый - как уже упоминалось в комментарии, вы используете один и тот же экземпляр сканера в обоих пулах. Это объясняет, почему вы получаете результат только из одного потока.

Поскольку вы планировать эти потоки для каждого 30/40 секунд, они не будут работать параллельно для первого 3-4 проходит каждый:

30s: Thread A 
40s: Thread B 
60s: Thread A 
80s: Thread B 
90s: Thread A 
120s: Thread A + B (it will be "random" which one runs first) 

Существует непонимание концепции Thread. Неважно, есть ли у вас 2 бассейна по 10 нитей, или 1 пул с 20 потоками. В вашем примере это даже не имеет значения, если у вас есть только 1 пул с 1 потоком. Единственная причина использовать более одного пула - это управлять этими пулами по-разному и не иметь потоков внутри «отдельно». Поэтому, чтобы ответить на ваш реальный вопрос, неважно, как Java управляет этими пулами внутри страны.

Я не знаю остальной части вашего кода, но тот факт, что вы проверяете, закрыт ли пул, а затем создайте новый, говорит мне, что в вашем коде есть общая проблема. Выключение пула необходимо только в том случае, если все работы выполнены, и основной поток должен ждать завершения всех потоков для обработки данных или выхода. Особенно бессмысленно использовать пул потоков, чтобы сохранить накладные расходы на создание потоков, а затем создать пул снова и снова.

Слишком мало информации о том, что вы пытаетесь архивировать, чтобы дать какие-либо дополнительные предложения, но я уверен, что все, что вы пытаетесь сделать, можно сделать намного проще, чем вы представили. Это может быть полезно, если вместо этого вы отправляете архитектурную помощь.

+0

Извините за путаницу, я отредактировал вопрос, означаю, что все по-другому. Два отдельных экземпляра из двух разных runnables были вызваны через двух отдельных исполнителей. В пусках есть ситуации и механизм, которые необходимо перезапустить с помощью отдельного набора данных. В процессе перезапуска, Runnables останавливаются и Executor выключается, поэтому он проверяет состояние Executor и перенаправляет его во время перезагрузки. Резьба A занимает 2 секунды, а Thread B занимает 15 секунд. – user2960779

+0

Итак, в приведенном выше графике они часто сталкиваются, и когда они это делают, поток, который отправляется первым, ждет другого, это моя проблема. Постскриптум Нити не используют синхронизированный ресурс. – user2960779

0

Вот это scenerio:

public class ThreadA implements Runnable{ 

@Override 
public void run() { 
    // TODO Auto-generated method stub 
    Date startTime =new Date(); 
    System.out.println("Thread A started at - "+startTime); 
    try { 
     Thread.sleep(4000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    Date endTime =new Date(); 
    System.out.println("Thread A ended at - "+endTime); 
    System.out.println("Time taken by Thread A - "+(endTime.getTime()-startTime.getTime())+"ms"); 

}} 

public class ThreadB implements Runnable { 

@Override 
public void run() { 
    // TODO Auto-generated method stub 
    Date startTime = new Date(); 
    System.out.println("Thread B started at - " + startTime); 
    try { 
     Thread.sleep(60000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    Date endTime = new Date(); 
    System.out.println("Thread B ended at - " + endTime); 
    System.out.println("Time taken by Thread B - "+ (endTime.getTime() - startTime.getTime()) + "ms"); 
}} 

public class ExecutorTest { 

public static ScheduledExecutorService EXECUTOR_A = Executors.newScheduledThreadPool(10); 
public static ScheduledExecutorService EXECUTOR_B = Executors.newScheduledThreadPool(10); 

public static void main(String[] args) { 
    ThreadA threadA=new ThreadA(); 
    ThreadB threadB=new ThreadB(); 

    if(EXECUTOR_A.isShutdown()) 
     EXECUTOR_A=Executors.newScheduledThreadPool(10); 
    EXECUTOR_A.scheduleWithFixedDelay(threadA, 0, 30, TimeUnit.SECONDS); 

    if(EXECUTOR_B.isShutdown()) 
     EXECUTOR_B=Executors.newScheduledThreadPool(10); 
    EXECUTOR_B.scheduleWithFixedDelay(threadB, 0, 40, TimeUnit.SECONDS); 
}} 

Выход:

Тема Запущенный в - Чт ноя 07 12:22:12 IST 2013
Тема B началась в - Чт ноя 07 12:22:12 IST 2013
Тема А, закончившаяся - Чт Ноя 07 12:22:16 IST 2013
Время, затраченное на Thread A - 4025ms
Thread Запущенный в - Пт Ноя 07 12:22:46 IST 2013
Поток А закончился в - Пт Ноя 07 12:22:50 IST 2013
Время, затраченное на тему А - 4010ms
Thread B закончилась в - Чт Ноя 07 12:23:12 IST 2013
Время, затраченное на Thread B - 59996ms
Тема А начата в - Чт ноя 07 12:23:20 IST 2013
Тема А закончилась - Вт Ноя 07 12:23:24 IST 2013
Время, затраченное на тему а - 4010ms

Идеальный выход, как задумано. Это мой scenerio, но отлично работает здесь. Повторно проверит мой код.

 Смежные вопросы

  • Нет связанных вопросов^_^