3
public class ThreadState {

    public static void main(String[] args){
            Thread t = new Thread(){
            public void run(){
                       // infinite loop
                       while (true) {
                        try {

                         Thread.sleep(1000);
                        }
                        catch (InterruptedException e) {
                        }

                        System.out.println("thread is running..."+Thread.currentThread().toString());
                       }

            }
        };
        t.start() ; 
        t = null ;
        while (true) {
              try {

              Thread.sleep(3000);
              }
              catch (InterruptedException e) {
              }
              System.out.println("thread is running..."+Thread.currentThread().toString());
        }   

    }
}

スレッドインスタンス t は null に初期化されます.. それでも実行でき、その詳細をコンソールに出力します。これには説明が必要

4

5 に答える 5

11

スレッド インスタンス t は null に初期化されます

いいえ、Thread 変数は null 値を持つように設定されています。変数はインスタンスではありません - それを理解していることを絶対に確認する価値があります。

Thread変数の値を変更しても、既存のオブジェクトにはまったく影響しません。

于 2012-05-18T15:17:54.197 に答える
5

t = null;Threadインスタンスへの参照を削除するだけです。
スレッド自体には影響しません。

特に、実行中のThreadインスタンスが GC されることはありません。

于 2012-05-18T15:17:48.347 に答える
1

t を null に設定すると、スレッド自体には何も行われず、インスタンスへの参照を格納した変数に null が割り当てられるだけです。

たぶんこれが役立ちます:

あなたがしたらどうしますか

Object t = new Thread() {...}
t.start
Thread t2= (Thread)t;
t="Orange";

その時も魔法のようなことが起こると思いますか? t2 に別の参照を格納する代わりに、別のメソッドに t を渡したらどうなるでしょうか?

t はスレッドへの参照のプレースホルダーにすぎません。何かを t に割り当てると、null を a の下に割り当てると数値 2 になるのと同じくらいスレッドに影響を与えます。

Integer a = 2;
a=null;
于 2012-05-18T15:17:38.093 に答える
1

@JonSkeetと他の人はt = null、実行Threadをまったく変更していないことをよく説明しています。変数を変更しているだけですt。スレッドが開始されると、JVM がスレッドを管理するため、スレッドへの参照がなくても実行され、GC されません。

指摘すべきもう1つのことは、次のループで次のことを行っていることです。

System.out.println("thread is running..."+Thread.currentThread().toString());

これは、フォークしたばかりのスレッドのステータスを出力するのではなく、現在のスレッド(フォークを行ったスレッド) を出力します。main()これは、メソッドを実行する「メイン スレッド」です。メイン スレッドが終了しても、分岐したスレッドは引き続き実行され、JVM が終了しません。フォークしたスレッドがデーモン スレッドとしてマークされている場合にのみ、メイン スレッドの終了時に JVM が終了します。

于 2012-05-18T15:26:24.997 に答える
0

Jon は正しいと思います。つまり、「変数の値を変更しても、既存の Thread オブジェクトにはまったく影響しません。」

しかし、あなたが必要とした実際の説明は

スレッドにローカルな静的メモリまたはグローバル メモリを使用するプログラミング メソッド。通常、プロセス内のすべてのスレッドが同じアドレス空間を共有するため、これは望ましくない場合があります。つまり、静的変数またはグローバル変数のデータは、通常、同じプロセスのスレッドによって参照される場合、常に同じメモリ位置に配置されます。各スレッドには独自のスタックがあります。

与えられた概念的な説明が役立つことを願っています。

于 2012-05-18T16:23:16.223 に答える