2016-07-05 2 views
-1

У меня проблемы в среде mulithreads. Я могу создать несколько потоков, которые выполняются правильно, но процесс никогда не заканчивается. Я не могу дождаться окончания. Я хочу сделать какое-то действие, когда все мои потоки закончатся, но в настоящее время это невозможно. Здесь мой код:Я не могу ждать мои темы в java

public static void main(String[] args){ 

public void run(){ 
      ExecutorService exec = Executors.newFixedThreadPool(10); 
    try { 
       for(int i=0;i<100;i++){ 
        final Integer a=i; 
        try { 
         exec.submit(new Runnable() { 
         @Override 
          public void run() { 

         System.out.println(a); 
         } 
        }); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
      catch(Exception e){ 
       e.printStackTrace(); 
      } 
     } 
} 

Кто-то знает, как достичь моей цели? Благодаря!

+1

Где вы звоните 'Notify()'? – Kayaman

+0

Почему вы создаете новый пул потоков внутри потока? У вас уже есть поток для выполнения. –

+1

Также посмотрите http://stackoverflow.com/questions/1250643/how-to-wait-for-all-threads-to-finish-using-executorservice. –

ответ

2

Не создать поток и ExecutorService. Это избыточно.

В настоящее время ваша программа не выходит из-за того, что основной поток называется wait(), но ни один другой поток не вызывает notify().

Если вы хотите, чтобы основной поток ждать, пока все задачи не закончу, сделать что-то вроде этого:

final class EjecutorUpdateContactos { 
    void update() throws Exception { 
    ExecutorService workers = Executors.newFixedThreadPool(10); 
    List<Callable<Void>> tasks = new ArrayList<>(); 
    for(int i = 0; i < 100; i++) { 
     int a = i; 
     tasks.add(new Callable<Void>() { 
     @Override 
     public Void call() { 
      System.out.println(a); 
      return null; 
     } 
     }); 
    } 
    workers.invokeAll(tasks); 
    workers.shutdown(); 
    } 
} 
-2

Попробуйте это:

public class EjecutorUpdateContactos extends Thread { 

    @Override 
    public void run() { 
     ExecutorService exec = Executors.newFixedThreadPool(10); 
     try { 
       for (int i = 0; i < 100; i++) { 
       final Integer a = i; 
       try { 
        exec.submit(new Runnable() { 
         @Override 
        public void run() { 

         System.out.println(a); 
        } 
       }); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     notify(); 
    } 
    } 
} 

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

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