0

我正在做一些并发编程,其中一部分困扰着我。

假设我有一些类Foo扩展了 Thread 并实现了它自己的公共方法bar()以及所需的run()方法。如果我实现多个Foo对象,每个对象都包含对另一个Foo对象的引用,并且在类的run()方法内部是对它所引用的任何对象Foo的方法的调用。如果名为“ ”的对象调用了名为“ ”的对象,那么究竟是谁在执行“ ”中的方法代码?执行是从“ ”移交给“ ”执行还是“继续执行”中的代码bar()FooFooThread-1bar()FooThread-2Thread-2Thread-1Thread-2Thread-1Thread-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 回答