1

私は次のコードを持っています:

Executor exe = Executors.newFixedThreadPool(20);
while (true) {
   try {
       exe.execute(new DispatcherThread(serverSocket.accept()));
       continue;
   } catch (SocketException sExcp) {
       System.exit(-1);
   } catch (Exception excp) {
       System.exit(-1);
   }
}

データベースへの接続を作成するたびDispatcherThreadに (つまり、20 個の接続があることを意味します)、スレッドが停止したとき、またはフローが停止または終了したときに、データベースへの接続を閉じる方法を知る必要があります。

4

2 に答える 2

4

スレッドがいつ停止したかを直接知ることはできません。最も近いのはメソッドですが、スレッド内のメソッドが終了したときにThread#isAlive戻る可能性がありますが、JVM が保証できないため、スレッドが停止しない場合があります。ただし、クラスがインターフェイスを実装している場合は、メソッドの最後にクリーンアップを記述できます。falserunDispatcherThreadRunnablerun

スケルトン コード:

class DispatcherThread implements Runnable {
    @Override
    public void run() {
        try {
            //open database connection an such...
            //...
            //handle the work here...
        } catch (...) {
            //ALWAYS handle the exceptions
        } finally {
            //cleanup tasks like close database connection
        }
    }
}

ちなみに、Thread接尾辞は、技術的にスレッドではないクラスの名前として適切ではありません ( から拡張されていないためThread)。代わりに、何をすべきかに従って適切な名前を付けてください。

于 2014-07-09T19:16:49.570 に答える
2

メソッドの最後でスレッド固有の接続を閉じることができますrun()

ブロックは、run() メソッドが終了したにもかかわらず発生したfinallyことを保証します。

class DispatcherThread extends Runnable {
    public void run() {
       ...
       try {
          ...
       }
       finally {
            // Close the connection
       }
    }
于 2014-07-09T19:16:41.940 に答える