在Java中,如果我调用一个从另一个可运行对象扩展Thread的类,哪个Thread执行?

时间:2012-04-19 19:21:41

标签: java multithreading concurrency thread-safety

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

假设我有一些类Foo,它扩展了Thread并实现了它自己的名为bar()的公共方法以及所需的run()方法。如果我实现多个Foo个对象,每个对象包含对另一个Foo对象的引用,并且run()类的Foo方法内部是{{1}它引用的任何bar()对象的方法。如果名为“Foo”的Foo对象在名为“Thread-1”的bar()对象上调用Foo,那么实际执行方法代码的是谁“Thread-2”? 执行是否从“Thread-2”传递到“Thread-1”以执行或“Thread-2”继续执行“Thread-1”中的代码?如果是第二种选择,我怎样才能让它像第一选择一样?

4 个答案:

答案 0 :(得分:4)

只有在您调用thread.start()(或使用executor.submit(runnable))时才会启动新线程。所有其他方法调用都保留在当前线程中。

答案 1 :(得分:0)

Foo只是一个对象,想象它不会扩展Thread,你会期待什么?只要新线程不是start() ed,你就是代表调用线程调用普通方法。

此外,如果在不同的Thread对象上调用方法会导致该线程接管执行,那么当前线程的执行会发生什么?

答案 2 :(得分:0)

除了在启动线程时执行,run()是一种常规方法。如果你手动调用,它的行为就像任何其他方法一样,这意味着它在调用者的线程中执行。

答案 3 :(得分: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();        
     }
}

应该打印'parent';