我不能在java中等待我的Threads

时间:2016-07-05 19:08:18

标签: java multithreading wait

我在mulithreads环境中遇到问题。我可以创建几个正确执行的线程,但是这个过程永远不会结束。我等不及整理了。 当我的所有线程结束时我想做一些动作但目前是不可能的。这是我的代码:

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();
            }
        }
}

有人知道如何实现我的目标吗?谢谢!

2 个答案:

答案 0 :(得分: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();
  }
}

答案 1 :(得分:-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();
    }
  }
}