2012-04-13 11 views
1

私はしばしば呼び出されるイベントメソッドを持つクラスを持っています。メソッド名がonClickedであるとします。メソッドの中で、私はいくつかのものを行うスレッドを作成します。イベントメソッドのスレッドオブジェクト:クラスメンバーを使用するか、ローカルオブジェクトを作成しますか?

まず、イベントメソッド内にスレッドオブジェクトを作成してみました。

public class MyService { 

    //Event method 
    public void onClick() { 
     new Thread(new Runnable() { 

      @Override 
      public void run() { 
       // do some stuff here 
      } 
     }).start(); 
    } 
} 

しかし、onClickのは、多くの場合、イベントメソッドが呼び出されたときに毎回作成された新しいスレッドオブジェクトがメモリ空間やパフォーマンスの問題を作成した場合、私は心配している、と呼ばれるであろうから:?コードは次のようですか

代わりに、私はこのようなクラスのメンバスレッドソリューションを作成することができます

public class MyService { 
    private Thread myThread; 

    //Event method 
    public void onClick() { 
     myThread = new Thread(new Runnable() { 

      @Override 
      public void run() { 
        // do some stuff here 
      } 
     }); 
     myThread.start(); 
    } 
} 

をので、どのコードが良いですか? 1位か2位?それとももっと良い解決策がありますか?

+0

実際の質問ではありません。あなたは毎回新しいスレッドを作成しなければなりません。あなたは選択肢がないので、それについての「ベター」はありません。 – EJP

答えて

3

OnClick()のスレッドを再初期化せずに2番目のコードを使用することはできません。これは、スレッドが実行を終了すると、「死んでいる」ためです。したがって、start()へのその後の呼び出しは失敗し、IllegalThreadStateExceptionになります。

完了後にGCがスレッドを削除するので、最初のコードを使用する方がよいでしょう。

+0

申し訳ありませんが、私は2番目のコードで間違いました。私はそれを更新しました。したがって、メンバスレッド変数を使用する2番目のコードでは、メモリ節約またはパフォーマンスの点で第1コードとの違いはありませんか? – null

+0

Thread()コンストラクタをどちらかの方法で呼び出す必要があるため、正しいです。 – lrAndroid

0

毎回onclickという新しいスレッドを作成しているので、両方のソリューションが同じだと思います。 2番目のスレッドは、新しいスレッドが作成されてグローバル変数myThreadに割り当てられ、startが呼び出される前に、別のonclickイベントが入ってきて、前のグローバル変数を再割り当てすることがありません。 私はリソースが不足のを避けるために、ここで許可されるスレッドの数を制御するために

ThreadPoolExecutor

を見て、あなたを提案します。

+0

ThreadPoolExecutorを使用する必要があるのはどのような状況ですか? – null

0

ExecutorServiceを作成して初期化してから、runnableインターフェイスを実装する独自のクラスのインスタンスを作成できます。それは、プールの数(サイズ)を指定することによって、スレッドが多すぎるのを避けることです(ExecutorService:スレッドプールの修正)。それは良い方法です。

私が言ったように、小さなリファクタリングを行い、独自のクラスイベントを作成してRunnableを実装することができます。ポイントはコンストラクタを定義することです。

+0

あなたが与えた最初の解決策は、evanwongのものと同じですよね? 2番目のクラス(runnableクラスのイベントを作成)では、パフォーマンスが向上しますか? – null

+0

ここではパフォーマンス上の問題ではなく、よりコードを設計しています。しかし、あなたはまだプール内のスレッドの数で遊ぶことができます。しかし、私たちはモバイルシステム(バッテリ寿命/性能)に取り組んでいることを忘れないでください。 –

関連する問題