Ява: перерыв Набора для нитей в ThreadPool

Я хочу установить перерывы для нитей, которые выполняются в пуле потоков. В данный момент у меня есть следующий код:

ExecutorService executor = Executors.newFixedThreadPool(8);
for(List l: partition) {            
    Runnable worker = new WorkerThread(l);
    executor.execute(worker);
}       

executor.shutdown();
while (!executor.isTerminated()) {

}

Кодекс просто разделяет большой список объектов в подсписки, и обработайте, они подперечисляют в единственных нитях. Но это не пункт.

Я хочу дать каждую единственную нить в пуле потоков перерыв. Только для одной нити в бассейне я нашел следующее решение:

Future<?> future = null;

for (List l : partition) {
    Runnable worker = new WorkerThread(l);
    future = executor.submit(worker);
}

try {
    System.out.println("Started..");
    System.out.println(future.get(3, TimeUnit.SECONDS));
    System.out.println("Finished!");
} catch (TimeoutException e) {
    System.out.println("Terminated!");
}

But this would not work for more than one thread. Maybe I have to put each thread in a List list and iterate over this list and set a timeout for each future object?

Какие-либо предложения?

ОТРЕДАКТИРУЙТЕ ПОСЛЕ ИСПОЛЬЗУЯ CountDownLatch:

CountDownLatch doneSignal = new CountDownLatch(partition.size());
List tasks = new ArrayList();
ExecutorService executor = Executors.newFixedThreadPool(8);
for (List l : partition) {
    Runnable worker = new WorkerThread(l);
    tasks.add(executor.submit(doneSignal, worker));
}

doneSignal.await(1, TimeUnit.SECONDS);
if (doneSignal.getCount() > 0) {
    for (Future<?> fut : tasks) {
    if (!fut.isDone()) {
        System.out.println("Task " + fut + " has not finshed!");
        //fut.cancel(true) Maybe we can interrupt a thread this way?!
    }
    }
}

Работы, хорошие до сих пор.

Поэтому следующий вопрос состоит в том, как прервать нить, которая рассчитана? Я пробую fut.cancel (верный) , и добавляют следующую конструкцию в некоторых критических петлях в рабочем потоке:

if(Thread.interrupted()) {
    System.out.println("!!Thread -> " + Thread.currentThread().getName() + " INTERRUPTED!!");
        return;
}

Таким образом, рабочий поток "убит" после перерыва. Действительно ли это - хорошее решение?

Кроме того: действительно ли возможно получить название нити, которая рассчитала по интерфейсу Future ? В данный момент я должен распечатать имя в, если условие Thread.interrupted() строит.

Спасибо за помощь!

Отношения

8
nl ja de
Положительная сторона @DavidSchwartz, однако могут быть ситуации, были работы, абсолютно независимы друг от друга. Я don' t знают, ли OP на самом деле, хотя об этом, но он похож дело обстоит так здесь.
добавлено автор fge, источник
Да это работает на больше, просто держите фьючерсы в Списке.
добавлено автор Fildor, источник
Пожалуйста, don' t думают о нитях этот путь. Есть то, чтобы это было сделанным, и вы хотите перерыв, если он берет больше, чем определенное количество времени. It' s не независимо от того, что нить, могло бы оказаться, делала бы ту работу, it' s работа . Возможно, две нити сотрудничают на работе. Возможно, никакая нить не работает над той работой в то время. Но it' s работа вы хотите остановиться или перерыв или что бы то ни было, не нить или нити, которые могли бы или, могло бы оказаться, не работали бы над ним. Это тонкое изменение представления важно для размышления правильно о нитях так, чтобы вы волновали с хорошими проектами.
добавлено автор David Schwartz, источник
@fge: It' s не об отношениях работ друг другу. It' s о понятии "работы" (вещь, которая должна быть сделана) быть отличным от нити (нитей), которые делают его. Если работа ждет чего-то, никакая нить не может быть связана с нею. Если работа может быть сделана одновременно, многократные нити могут сотрудничать, чтобы сделать это. Когда вы ждете некоторой работы, которая будет сделана, вы shouldn' t думать о том, какая нить или нити, если таковые имеются, работают над ним.
добавлено автор David Schwartz, источник

1 ответы

Have you seen this? ExecutorService.invokeAll

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

ОТРЕДАКТИРУЙТЕ после комментария - (новая идея): Можно использовать a CountDownLatch чтобы ждать задач закончиться И перерыв с помощью ждут (длинный перерыв, отделение TimeUnit) ! Можно тогда даже сделать shutdownNow и видеть, какие задачи заняли слишком много времени...

ОТРЕДАКТИРУЙТЕ 2:

Сделать его более ясным:

  1. Have a CountDownLatch be count down by each Worker, when finished.
  2. In the main execution thread await with timeout on said latch.
  3. When that call returns, you can check the Latches's count to see if there has been the timeout hit (if it is >0).
  4. a) count = 0, all tasks finished in time. b) if not, loop the Futures and check their isDone. You don't have to call shutdown on the ExecutorService.
  5. Call shutdown if you do not need the Executor any longer.

Примечание: Рабочие могут закончить тем временем между перерывом и запросом isDone их будущего ().

3
добавлено
Хорошо... Тем не менее, я должен звонить "executor.shutdown ()", чтобы ждать, если нити закончены вообще, правильно?
добавлено автор sk2212, источник
Ahh, хорошо очень хороший. "CountDownLatch" выглядит очень хорошим. Вы говорите (в вашем "редактировать" линии), что я могу управлять shutdownNow после того, как запрос ждет. Так метод shutdownNow отменит все нити, которые все еще бегут из-за перерыва набора? Это - мой следующий вопрос, потому что я нахожу, что путь с invokeAll не узнает, какие нити "нарушают" перерыв. Возможно, с новым подходом это возможно?
добавлено автор sk2212, источник
Хорошо, но также и если я повторяю по фьючерсам и спрашиваю их, если они сделаны, я должен назвать закрытие() или shutdownNow (). В данный момент я добираюсь "java.util.concurrent. CancellationException", делая это, не называя закрытие (): Список <будущее <Последовательность>> перечисляет = executor.invokeAll (задачи, 1, TimeUnit. СЕКУНДЫ); для (будущее <Последовательность> будущее: список) {если (fut.isDone ()) {\ System.out.println ("Задача" + fut.get() + "закончилась".); }} будущее возвращает последовательность с именем Нити.EDIT: БЕЗ ИСПОЛЬЗОВАНИЯ "CountDownLatch"
добавлено автор sk2212, источник
Я редактирую свой пост с CountDownLatch. Работы, хорошие до сих пор. Просто некоторые другие вопросы;-).
добавлено автор sk2212, источник
Не обязательно. Вы могли все еще ездить на велосипеде через фьючерсы, которые опрос isDone() или требование получает() на каждом будущем, или вы могли использовать a docs.oracle.com/javase/7/docs/api/java/util/concurrent/… Я считаю последнего "самым хорошим" путем.
добавлено автор Fildor, источник
Только небольшое изменение. You' требование ll ждет на случае CountDownLatch с перерывом. То требование заблокирует до хитов перерыва или замка до 0. После этого вы можете shutdownNow, который возвращает список... а-а-а просто чтения it' s только неначатые задачи, которые возвращаются shutdownNow. Но можно все еще повторить фьючерсы и спросить их, если они сделаны:)
добавлено автор Fildor, источник
У вас есть stacktrace и ваши кодовые изменения для нас?
добавлено автор Fildor, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async