我正在研究一些并发编程,其中一部分困扰着我。
假设我有一些类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
”中的代码?如果是第二种选择,我怎样才能让它像第一选择一样?
答案 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';