我等不及我在java中的线程[重复]

Posted

技术标签:

【中文标题】我等不及我在java中的线程[重复]【英文标题】:I can't wait my Threads in java [duplicate] 【发布时间】:2016-11-07 17:32:42 【问题描述】:

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

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 中创建一个新的线程池?你已经有一个线程要执行了。 也看***.com/questions/1250643/…。 【参考方案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();
    
  

【讨论】:

以上是关于我等不及我在java中的线程[重复]的主要内容,如果未能解决你的问题,请参考以下文章

java - 为啥main方法没有转换为java中的守护线程[重复]

Java多线程和Thread.sleep [重复]

java在超时值后杀死线程[重复]

线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:Calculator.main 中的 0(Calculator.java:25)[重复]

JAVA开启三个线程,去读取数组中的数据不能重复

java线程只能被启动(Thread.start())一次,那么为啥线程池中的线程能被重复利用呢?