我有以下代码来使用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打印输出永远不会出现:
有一个例外:连接关闭后不允许任何操作。 线程退出。
请在我所有的子线程退出后,以正确的方式告诉我让我的主线程退出。
答案 0 :(得分:3)
首先,为什么所有忙碌的纺纱?最节省CPU的方法是放置一个非常低的awaitTermination
:
threadExecutor.shutdown();
threadExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
至于池没有终止的原因很可能是因为你的线程任务没有正常终止。