それぞれのワーカが独自の接続ソケットを持つJavaでワーカーのプールを構築する必要があります。ワーカースレッドは実行時にソケットを使用しますが、後で再利用するために開いたままにします。アドホックベースのソケットの作成、接続、破棄に伴うオーバーヘッドにはオーバーヘッドがかかりすぎるため、ソケット接続で作業者プールを事前準備しておく準備ができている必要があります。他のスレッド(ソケットはスレッドセーフではありません)から安全なソケットリソースを維持しながら、仕事を取るので、我々はこれらの線に沿って何かを必要とする...アプリケーションの起動時に接続オブジェクト(ソケット)を再利用するためにワーカースレッドのプールを事前に初期化する
public class SocketTask implements Runnable {
Socket socket;
public SocketTask(){
//create + connect socket here
}
public void run(){
//use socket here
}
}
、我々は初期化したいです労働者と、うまくいけば、ソケット接続も何らかの形で...
MyWorkerPool pool = new MyWorkerPool();
for(int i = 0; i < 100; i++)
pool.addWorker(new WorkerThread());
グレーとjontejjから有益なコメントをもとに
作業はアプリケーションによって要求されるように、我々は、即時実行のための労働者のプールにタスクを送信...ワーキングコード
で更新
pool.queueWork(new SocketTask(..));
、私が働いて、次のコード...
SocketTask
ExecutorServiceの
ExecutorService threadPool =
Executors.newFixedThreadPool(5, Executors.defaultThreadFactory());
int tasks = 15;
for(int i = 1; i <= tasks; i++){
threadPool.execute(new SocketTask("foobar-" + i));
}
私はいくつかの理由のために、このアプローチが好き...
- ソケットは、並行性の問題を排除し、実行中のタスクに利用できる(ThreadLocalの経由)ローカルオブジェクトです。
- ソケットは一度作成され、開いたままにされ、新しいタスクがキューに入れられると が再利用され、ソケットオブジェクトの作成/破棄のオーバーヘッドがなくなります。
おかげで、私をたくさん助けました!私は不思議に思っていました:どのようにスレッドプールがシャットダウンされたときにdb接続を閉じますか? – kaufmanu
実行スレッドの[秩序シャットダウン](http://stackoverflow.com/questions/3332832/graceful-shutdown-of-threads-and-executor)を検索して、役立つことを願っています。 – raffian
私はそれをチェックしました、ありがとう!私は完全に私を助けませんでした...私は、ThreadLocalに格納されているすべてのdb接続のdbconnection.close()を呼び出す方法を探しています。私は本当にこれにアプローチする方法がわからない...つまり、スレッドプールがシャットダウンされると、db接続は自動的に閉じられません。 – kaufmanu