私のプログラムをマルチスレッドにする方法をよく分かりません。基本的に私は接続して動作させるキューサーバーを持っていますが、より多くのスレッドを起動してより速く作業を送信すると、スレッドがブロックされていることがわかります。スレッドでサーバーへの接続を維持していますか?
ここに私がやっていることの例があります(私のプログラムでは、共有接続から派生したいくつかのデータとチャンネルを送信しています)。
class Send_to_Queue implements Runnable{
protected String queue_name = null;
protected Channel channel = null;
protected byte[] message = 0
public Send_to_Queue(String queue_name, byte[] message, Channel channel) {
// TODO Auto-generated constructor stub
this.queue_name = queue_name;
this.message = message;
this.channel = channel;
}
チャネルは、ブロックされているすべてのスレッドが共有するスレッドに固有のものではありません。私はThreadPoolExecutor
の人生の中で新しいチャンネルを作成し、各タスクで新しいもの(高価なもの)を作成しないようにする方法がわからないため、これを行うための最善の方法を少し混乱させるだけです。仕事がない場合はシャットダウンしても問題ありませんが、4スレッドと100ユニットのワークがあれば、新しいチャンネルを100回ではなく4回だけ作成したいと思っています。
私は新しいチャンネル/私のサーバーへの接続は、すべてのインスタンスに確立されていない方法でそれを行う方法を理解していないようです。スレッドに接続を渡すと、新しいチャネル(this.channel
の下に新しいチャネル毎回作成された)
なぜ、各スレッドで新しいチャンネルを作成するのは費用がかかりますか?私にはそれは明らかな方法です。 – Gray
@Gray申し訳ありませんが、私はそれを間違って書いたと思います、私は新しいチャンネルを作りたいと思っていましたが、スレッドが作成されたときだけ(どのようにわからないのですか)毎回のデータがスレッド回)。あるチャンネルをスレッドが使用できるのは、そのスレッドを常に作成する理由です。スレッドごとに1つの接続が存続している間、そのスレッドは生き続けることができます。 – Lostsoul
@Grayまたは私はこれを間違った方法で考えており、作業単位ごとに新しいチャンネルを開始していますか?私がこれについて考えてきたもう一つの理由は、スレッドごとに新しい接続を確立するために同じロジックを使うことができるからです。パフォーマンスの違いをテストできます(基本的には非常に小さい作業ですが、私はできるだけオーバーヘッドを減らそうとしています)。 – Lostsoul