1

私はリストを持つクラスを書いています。そして、 の run メソッドからリストをインスタンス化していますRunnable。として:

public void sendEmailToLegalUsers() {
    Log.info("JYM====================================");

    try {
        new Runnable() {

            public void run() {
                userCns = new ArrayList<String>();
                recipients = new ArrayList<String>();

                ///other codes
            }
        };                  
    } catch (Exception e) { 
        Log.info("Error occurred in LDAPSendMail: "+ e.getMessage());
    }   

    Log.info("END====================================");
}

sendEmailToLegalUsers メソッドが呼び出されるたびに、新しいスレッドが作成されます。今、私はリストのメモリスコープがクラスレベルにバインドされているのだろうかと思っています(クラスレベルにバインドされていて、このメソッドが2回呼び出された場合、スレッド1によって作成されたリストはどうなりますか?スレッド 2) またはスレッドが独自のスコープで実行される場合、リストはスレッドごとに異なるスコープになります。2 つまたは複数のスレッド間でリスト データを混同する可能性はありますか?

4

4 に答える 4

4

スレッドごとに新しいリストのペアを作成しています。また、それらをローカル変数にする必要があります。そうしないと、リストではなくリストへの参照でスレッドセーフの問題が発生する可能性があります。

new Thread(new Runnable() {
    public void run() {
        List<String> userCns = new ArrayList<String>();
        List<String> recipients = new ArrayList<String>();

        ///other codes
    }
}).start();

userCns または受信者がフィールドの場合、フィールドが共有されるため、スレッド間で共有できます。

于 2012-08-29T14:37:48.420 に答える
4

両方のスレッドに同じRunnableクラスを使用している場合、はい、重複があります。new Runnable()スレッドごとに個別の がある場合、いいえ、それらは個別のリスト インスタンスになりますが、これは、リストが に対してローカルであると定義されている場合のみですRunnable。リストが呼び出し元のクラスで定義されている場合、メソッドを 2 回目に呼び出すと、 フィールドuserCnsrecipientsフィールドが上書きされます。

あなたの場合、フォークされているスレッドはまったく見られません。私が見るのは、あなたがRunnable. 次のようなことをしようとしていませんか?

    new Thread(new Runnable() {
        public void run() {
            // lists are local to the runnable
            List<String> userCns = new ArrayList<String>();
            List<String> recipients = new ArrayList<String>();
           ///other codes
        }
    }).start();

sendEmailToLegalUsers()この場合、メソッドを呼び出すたびにRunnable、新しいリストで新しい が作成されます。

于 2012-08-29T14:37:03.770 に答える
0

複数のスレッドが同じを呼び出している場合run()、リストはインスタンス スコープであり、両方のスレッドが同じリストで動作するため、間違った結果が生じる可能性があります。

スレッドごとに新しい Runnable() を作成すると、それらは独自のコピーを持ち、互いのデータを更新しません。

于 2012-08-29T14:36:51.807 に答える
0

新しい Runnable を作成していますが、何もしていません。新しいスレッドを作成していないことは確かです。

ただし、作成された Runnables をスレッドに渡す場合、参照は Runnable インスタンスに制限されます。

于 2012-08-29T14:39:12.473 に答える