0

私はいくつかの並行性プログラミングに取り組んでおり、一部が私を悩ませています。

FooThreadを拡張bar()し、必要なメソッドと同様に呼び出される独自のパブリックメソッドを実装するクラスがあるとしrun()ます。複数のオブジェクトを実装するFooと、それぞれに別のFooオブジェクトへの参照が含まれ、クラスのrun()メソッド内には、参照先のオブジェクトに対するメソッドの呼び出しがあります。「」という名前のオブジェクトが「」という名前のオブジェクトを呼び出す場合、実際に「」のメソッドコードを実行しているのは誰ですか?実行は「 」から「」に渡されて実行されますか、それとも「」は「」でコードの実行を継続しますかFoobar()FooFooThread-1bar()FooThread-2Thread-2Thread-1Thread-2Thread-1Thread-2「?それが2番目の選択肢である場合、どうすれば最初の選択肢のように動作させることができますか?

4

4 に答える 4

4

新しいスレッドは、を呼び出すthread.start()(または使用するexecutor.submit(runnable))場合にのみ開始されます。他のすべてのメソッド呼び出しは、現在のスレッドに残ります。

于 2012-04-19T19:24:58.143 に答える
0

Fooただのオブジェクトです、それが拡張しないと想像してくださいThread、あなたは何を期待しますか?新しいスレッドが編集されていない限りstart()、呼び出し元のスレッドに代わって、通常のメソッドを呼び出しているだけです。

さらに、別のThreadオブジェクトでメソッドを呼び出すと、そのスレッドが実行を引き継ぐ場合、現在のスレッドの実行はどうなりますか?

于 2012-04-19T19:26:07.833 に答える
0

スレッドの開始時に実行されることrun()は別として、通常の方法です。手動で呼び出すと、他のメソッドと同じように動作します。つまり、呼び出し元のスレッド内で実行されます。

于 2012-04-19T19:26:18.300 に答える
0

それを呼び出したスレッドで実行されます。スレッドを拡張するクラスのメソッドを呼び出すことは、他のクラスのメソッドを呼び出すことと同じです。

public class A extends Thread
{
     public void bar()
     {
         System.out.println(Thread.currentThread().getName());
     }

     public void run()
     {
         new A().bar();
     }

     public static void main()
     {
         A testA = new A();     
         testA.setName("parent");
         testA.start();        
     }
}

'親'を出力する必要があります。

于 2012-04-19T19:28:16.803 に答える