Я вызываю Список потоков с помощью invokeAll(). AFAIK invokeAll() вернется только тогда, когда все потоки завершат свою задачу.Прерывать все потоки, если исключение происходит в любом из потоков из списка нитей
ExecutorService threadExecutor = Executors.newFixedThreadPool(getThreadSize());
List<Future<Object>> future = w_threadExecutor.invokeAll(threadList);
это называется, когда все нити заканчивают
for (Future<Object> w_inProgressThread : w_future)
{
//
Это останавливает поток, в котором исключение Произошло, а не оставшиеся один. Есть ли способ остановить все остальные потоки, если какое-либо из исключений потока выдает? Или мне нужно отправить каждую задачу вместо invokeAll() ??
Я попытался использовать invokeAny() вместо invokeAll(), но не отменил оставшуюся задачу. invokeAny(): Если одна из задач завершена (или выбрасывает исключение), остальная часть Callable отменяется. Ref: http://tutorials.jenkov.com/java-util-concurrent/executorservice.html
Update:
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(w_threadExecutor);
List<Future<Object>> futures = new ArrayList<Future<Object>>();
for(Thread w_mt : threadList)
{
futures.add(completionService.submit(w_mt));
}
for (int numTaken = 0; numTaken < futures.size(); numTaken++) {
Future f = completionService.take();
try {
Object result = f.get();
System.out.println(result); // do something with the normal result
} catch (Exception e) {
System.out.println("Catched ExecutionException, shutdown now!");
//threadExecutor.shutdownNow();
Thread.currentThread().interrupt();
for (Future<Object> inProgressThread : futures)
{
inProgressThread.cancel(true);
}
break;
}
Update 1:
Как было предложено waltersu я попытался
ExecutorService threadExecutor = Executors.newFixedThreadPool(3);
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(threadExecutor);
List<Future<Object>> futures = new ArrayList<Future<Object>>();
futures.add(completionService.submit(new Callable<Object>() {
@Override
public Object call() throws Exception {
String s=null;
// Thread.sleep(1000);
for(int i=0; i < 1000000; i++){
int j =10 ;
if(i==100)
{
s.toString();
}
System.out.println("dazfczdsa :: " + i);
}
//throw new Exception("This is an expected Exception");
return s;
}
}));
futures.add(completionService.submit(new Callable<Object>() {
@Override
public Object call() throws Exception {
for(int i=0; i < 1000000; i++){
int j =0 ;
j= j+2;
System.out.println("dasa :: " + i);
}
Thread.sleep(3000);
return "My First Result";
}
}));
while (futures.size() > 0) {
Future f = completionService.take();
futures.remove(f);
try {
Object result = f.get();
System.out.println(result); // do something with the normal result
} catch (ExecutionException e) {
System.out.println("Caught exception from one task: " + e.getCause().getMessage() + ". shutdown now!");
f.cancel(true);
threadExecutor.shutdownNow();
break;
}
}
System.out.println("Main exists");
это не останавливается, когда происходит исключение
threadExecutor.notifyAll(), чтобы прервать все темы –
@AkashLodha 'notifyAll()' from 'Object'" Пробуждает все потоки, которые ждут на мониторе этого объекта ". Нити не ждут на мониторе какого-либо конкретного объекта, не так ли? Что мне не хватает? – davmac
Я предполагаю, что threadList - это потоки, требующие блокировки на одном объекте. –