Я хочу установить перерывы для нитей, которые выполняются в пуле потоков. В данный момент у меня есть следующий код:
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()
строит.
Спасибо за помощь!
Отношения