如何在主线程结束之前确保所有线程都已结束?

时间:2012-07-13 10:39:43

标签: java multithreading

我有以下代码来使用java多线程。

    ExecutorService threadExecutor = Executors.newFixedThreadPool(10);

    while(resultSet.next()) 
       { 
          name=resultSet.getString("hName");
          MyRunnable worker = new  Myrunnable(name);
          threadExecutor.execute( worker );
          Counter++;
    }


 threadExecutor.shutdown();
 System.out.println("thread shutdown");

 // Wait until all threads are finish
 while (! threadExecutor.isTerminated()) {

 }

 System.out.println("Finished all threads");

}// end try
    catch (Exception e) {
        e.printStackTrace();
    }

    System.out.println("END MAIN");

    DBConnection.con.close();           

运行功能如下:

//The constructor
MyRunnable (String name)  {
        this.name=name;
    }

public void run() 
{
        myclass Obj=new myclass();
        try {
            Obj.myFunction(name);
        } catch (Exception e) {

            System.out.println("Got an Exception: "+e.getMessage());
        }
        System.out.println(" thread exiting.");
}

在之前的帖子中,有人建议使用以下代码来等待线程结束。

while (! threadExecutor.isTerminated()) {
   try {
       threadExecutor.awaitTermination(1, TimeUnit.SECOND);
   }
   catch (InterruptedException e) {
        // you have to determine if someone can interrupt your wait
        // for the full termination of the executor, but most likely,
        // you'll do nothing here and swallow the exception, or rethrow
        // it in a RuntimeException
   }
}

现在,我在这两种情况下都面临着问题。如果我使用第一种方法,我的程序会运行,但最后它进入一个无限循环,前面是所有线程退出。从未出现END MAIN打印输出。如果我使用第二种方法,我从运行程序开始就得到以下错误,并且END MAIN打印输出永远不会出现:

  

有一个例外:连接关闭后不允许任何操作。    线程退出。

请在我所有的子线程退出后,以正确的方式告诉我让我的主线程退出。

1 个答案:

答案 0 :(得分:3)

首先,为什么所有忙碌的纺纱?最节省CPU的方法是放置一个非常低的awaitTermination

threadExecutor.shutdown();
threadExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);

至于池没有终止的原因很可能是因为你的线程任务没有正常终止。