マルチスレッドを使用するコードで作業しています。関連するコード部分は、次の構造になっています。
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();
実行機能は確実に終了します。DB の姓が必要な機能を実行し、そのスレッドが終了します。
//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 は決してシャットダウンせず、プログラムは無限ループに入ります。
編集
DB から名前を抽出するメインのコードを次に示します。
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());
}