4

私はJavaでスレッドを開始しています。私の状況でstart()/がどのようにrun()機能するかを明確にしたいと思います。

スレッド calle t を作成し、t.start()その後に for サイクルを配置しました。

forサイクルはthread.tの一部になりますか、それともメインスレッドの一部ですか??


class Job implements Runnable{
Thread t;

    Job(String tName){
        t=new Thread(this, tName);
        System.out.println("This is thread: "+t.getName());
        t.start();
        System.out.println("This is the end of constructor");
        try{   /*<<<<<<<------------WILL THIS RUN in my MAIN thread or in the t thread??*/
            for(int i=0;i<5;i++){
                System.out.println("xxxThis is the count i value: "+i+" "+ t.getName());
                Thread.sleep(1000);
            }
        }
        catch(InterruptedException e){
        System.out.println("The thread has been interrupted");
        }

    }

    public void run(){
        System.out.println("This is the start of RUN()");
        try{
            for(int i=0;i<5;i++){
                System.out.println("This is the count i value: "+i+" "+ t.getName());
                Thread.sleep(1000);
            }
        }
        catch(InterruptedException e){
        System.out.println("The thread has been interrupted");
        }
        finally{
            System.out.println("Fnally block reached: "+t.getName());
        }
    }
}
4

3 に答える 3

2

メソッドt.start()と次のtry/forコードは同じスレッドで実行されます。メイン スレッドから Job(String) コンストラクターを呼び出した場合、これはメイン スレッドです。

メソッドはrun()新しいスレッドで実行されます。

于 2013-04-29T18:04:05.440 に答える
2

私の状況で start()/run() がどのように機能するかを明確にしたいと思います

start()メソッドは新しい実行スレッドを生成し、そのスレッドで run メソッドを実行します。この場合、スレッドには独自のcall stack. 一方、メソッドを直接呼び出しrun()ても、新しいスレッドは生成されません。代わりに、run()古いコール スタックを持つ現在実行中のスレッドでメソッドが実行されます。

forサイクルはthread.tの一部になりますか、それともメインスレッドの一部ですか??

forサイクルは、スレッドが生成される元のスレッドの一部になります(メイン スレッドでインスタンスを作成するThread場合はスレッドです) 。確認したい場合は、 for を使用してその for ループを実行している名前を出力するだけです。例:mainJobtthreadThread.currentThread().getName()

try{   /*<<<<<<<------------WILL THIS RUN in my MAIN thread or in the t thread??*/
    System.out.println(Thread.currentThread().getName()+" is executing this for loop");
    for(int i=0;i<5;i++){
        System.out.println("xxxThis is the count i value: "+i+" "+ t.getName());
        Thread.sleep(1000);
    }
于 2013-04-29T18:05:04.883 に答える
1

for サイクルは の一部になりますか、thread.tそれともメイン スレッドの一部ですか??

メインスレッド。スレッドがフォークされると、新しいスレッドはメソッドThreadを呼び出すだけです。run()あなたの場合、メインスレッドが呼び出してから、メソッドstart()の実行を続けます。これは実際には、新しいスレッドの開始が完了する前for()に呼び出される可能性が最も高いです。フォークされた新しいスレッドは、メソッドおよび によって使用されるその他のメソッドのみを呼び出します。run()run()

参考までに、オブジェクト コンストラクター内からスレッドを開始することは非常に悪い習慣と見なされています。これは、まだ初期化されている間に、現在のオブジェクトへの参照を「リーク」します。コンストラクターが終了した後で、 or 呼び出しにstart()メソッドを追加することを検討する必要があります。Jobstart()Job

 Job job = new Job(...);
 job.start();

また、メイン スレッドはforループを実行するスレッドであるため、スレッドではInterruptedExceptionなく、メイン スレッドが中断された場合にのみスローされJobます。

    catch(InterruptedException e){
        System.out.println("The thread has been interrupted");
    }
于 2013-04-29T18:04:40.673 に答える