我在使用多線程的代碼中工作。相關代碼的結構如下:使用線程池退出線程的無限循環
try {
ExecutorService threadExecutor = Executors.newFixedThreadPool(10);
while (resultSet.next()) {
name = resultSet.getString("hName");
MyRunnable worker = new Myrunnable(name);
threadExecutor.execute(worker);
Counter++;
}
//This never appears
System.out.println("End while with counter" + Counter);
threadExecutor.shutdown();
System.out.println("thread shutdown"); //this never appears
// Wait until all threads are finish
while (!threadExecutor.isTerminated()) {
threadExecutor.awaitTermination(1, TimeUnit.SECONDS);
System.out.println("inside the thread termination loop."); //I have infinite loop
}
System.out.println("Finished all threads"); //never appears
} 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" + this.name);
}
我的問題是我的程序正確執行的一切只是在最後一個線程,我看到了「線程退出」從DB的姓氏。但是threadexecutor從不關閉,程序進入無限循環。
編輯
這裏是主要的,它可以提取數據庫名稱的代碼。
try {
st = DBConnection.con.createStatement();
resultSet = st.executeQuery("select hName from schema1.table1 where checked=1 order by hName");
} catch (Exception e) {
System.out.println("DB Error: " + e.getMessage());
}
你說這個消息'結束while計數器結束'永遠不會出現。所以你的程序永遠不會退出while循環。然後它聽起來不像一個'ExecutorService'相關的問題。 – 2012-07-14 09:14:34
請注意,如果從數據庫讀取少量記錄,則線程結束並且程序終止。但是當數字增加時,程序永遠不會終止(或者至少長時間停留在循環中(+5分鐘),直到我手動終止它) – 2012-07-14 09:15:16
然後它可能與'Obj.myFunction(name)'是什麼有關如果它永遠不會結束,並且結果集有超過10條記錄(池的大小),則while循環永遠不會結束。 – assylias 2012-07-14 09:16:36