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位か?または、他のより良い解決策はありますか?

4

3 に答える 3

3

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

GC は完了後にスレッドを削除するため、最初のコードを使用することをお勧めします。

于 2012-04-13T04:05:39.307 に答える
0

毎回新しいスレッドを作成しているので、どちらのソリューションも同じだと思いますonclick。2番目のスレッドは、新しいスレッドが作成されてグローバル変数myThreadに割り当てられる状況に遭遇する可能性があり、それが呼び出される前にstart、別のonclickイベントが発生してグローバル変数を再割り当てし、前のスレッドは開始されません。私はあなたに見てみることをお勧めします

ThreadPoolExecutor

リソースの不足を回避するために、ここで許可されるスレッドの数を制御します。

于 2012-04-13T04:37:27.670 に答える
0

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

先ほど言ったように、小さなリファクタリングを作成し、独自のクラス イベントを作成して Runnable を実装することもできます。ポイントは、コンストラクターを定義することです。フィールドには追加のメソッドもいくつかあります。

于 2012-04-13T05:04:53.117 に答える