2011-12-14 6 views
0

私はシングルトンクラスをいくつかのスレッドで共有しています。私はいくつかの仕事をするための別のスレッドを作成したい、このシングルトンのメソッド内シングルトン内でのスレッドの作成

(ので、このシングルトンを使用するすべてのスレッドが追加のスレッドジョブを開始することができます)今

私は簡単な方法でスレッドを開始:

mSThread = new Thread(job that implements Runnable); 
mSThread.start(); 

スレッドmSThreadは、クラスのメンバとして宣言されて、私はそれが新しいスレッドが参照を作成されるたびに

を失われること大丈夫ですので、スレッドへの参照を保持する必要があるとは思わない、それは大丈夫です私がやったことや私がしたことをするスレッドプールのような別のテクニックを使用しますか?

+1

シングルトンと何が関係しているのか分かりません。あなたはメソッドを持っています。それを呼び出す人は、完了するまで実行される新しいスレッドを生成します。あなたはあまりにも頻繁にそれを呼び出すことに終わらない限り、それは大丈夫です、あなたはあまりにも多くのスレッドを作成します。そのような場合、はい、スレッドプールが優れています。しかし、あなたは良いアドバイスを与えるためにあまりにも少ない情報を提供しているので、少し詳しく説明してください。 –

+0

あなたはどうすればいいですか? (新しいスレッド(Runnableを実装するジョブ))。あなたの方法で?それはそれを行う必要があります。 – eboix

+0

ありがとう、しかし、私は他の何を追加する必要がありますか分からない:)、最大の数のスポーンは20-30です... – kenny

答えて

3

スレッドオブジェクトへの参照を保持することは絶対に必要ではないので、他のもののためにそれを必要としない場合は、メンバ変数に格納する必要はありません。スレッドを開始して参照を忘れることができます。

スレッドプールを使用する必要があるかどうかは、アプリケーションの正確な動作、新しいスレッドの開始頻度などによって異なります。これ以上の情報がなくても、これが価値あるものかどうかは分かりません。これを行うと、java.util.concurrentパッケージのクラスを使用することになります。 ExecutorServiceを使用すると、スレッドプール内のバックグラウンドタスクを開始できます。

0

私の意見では大丈夫です。

あなたが本当にここで直面しているのは、時期尚早の最適化問題です。スレッドはどれくらいの頻度で作成されますか?あなたのアプリはこれが問題になるほど忙しくなるでしょうか?ターゲットプラットフォームでは、新しいスレッドを作成するために必要なリソースと時間はどれくらいですか?

もう1つの質問は、管理(JMX)用に作成されたスレッドの数を把握したいのですか?

0

スレッドmSThreadは、クラスのメンバとして宣言されて

は、あなたはそれがシングルトンのインスタンス変数であることを意味していますか?もしそうなら、問題があるかもしれません。それをローカル変数にする方が良い。

+0

それはシングルトンの変数ですが、私はそれを使用しません – kenny

+0

インスタンス変数を使用するかどうかにかかわらず、メソッドの2回目の呼び出しがトレッドの作成と呼び出しの間に発生した場合、開始されていない新しいスレッドとそのスレッド二度始まった!! @eboixの別の場所で述べたように、 '新しいスレッド(Runnableを実装するジョブ).start(); 'を使うのがよいでしょう。 – OldCurmudgeon

1

スレッドはランタイムの不十分なリソースです。あなたのメソッドが呼び出されるたびに新しいものを生成することは無駄です。特にあなたのケースでは、あなたが気にしているのは、呼び出しスレッドがブロックされないようにするためです。したがって、メソッドがあまり頻繁に呼び出されないようにする必要があります。

今のところ、のコメントから、あなたはそれを行ったようです。また、メソッドをあまり頻繁に呼び出さないようにする必要があることを文書化する必要があります。しかし、将来の同僚は誤ってこの文書を見逃して、タイトなループで呼び出すことができます。

このような事態を防ぐには、スレッドプールを使用することをお勧めします。これは将来の誤った使用を防ぎます。特に、Sun/Oracleは厄介な詳細のほとんどを抽象化する素晴らしいパッケージjava.util.concurrentを提供しています。

関連する問題