【问题标题】:I can't wait my Threads in java [duplicate]我等不及我在java中的线程[重复]
【发布时间】:2025-11-24 19:05:01
【问题描述】:

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

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

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

【问题讨论】:

  • 你在哪里打电话给notify()
  • 为什么要在 Thread 中创建一个新的线程池?你已经有一个线程要执行了。

标签: java multithreading wait


【解决方案1】:

不要创建线程和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();
        }
      }
    }
    

    【讨论】:

      最近更新 更多