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

在Java中,如果我调用一个从另一个可运行对象扩展线程的类,那么执行哪个线程?,java,multithreading,concurrency,thread-safety,Java,Multithreading,Concurrency,Thread Safety,我正在进行一些并发编程,其中一部分让我感到困扰 假设我有一个类Foo,它扩展了线程并实现了自己的公共方法bar(),以及所需的run()方法。如果我实现了多个Foo对象,每个对象都包含对另一个Foo对象的引用,并且在Foo类的run()方法中,对它引用的任何Foo对象调用bar()方法。如果名为“Thread-1”的Foo对象调用名为“Thread-2”的Foo对象上的bar(),那么谁在实际执行“Thread-2”中的方法代码? 执行是从“Thread-1”转移到“Thread-2”执行,还是

我正在进行一些并发编程,其中一部分让我感到困扰

假设我有一个类
Foo
,它扩展了线程并实现了自己的公共方法
bar()
,以及所需的
run()
方法。如果我实现了多个
Foo
对象,每个对象都包含对另一个
Foo
对象的引用,并且在
Foo
类的
run()
方法中,对它引用的任何
Foo
对象调用
bar()
方法。如果名为“
Thread-1
”的
Foo
对象调用名为“
Thread-2
”的
Foo
对象上的
bar()
,那么谁在实际执行“
Thread-2
”中的方法代码?
执行是从“
Thread-1
”转移到“
Thread-2
”执行,还是“
Thread-1
”继续执行“
Thread-2
”中的代码?如果它是第二个选择,如何使它像第一个选择一样工作?

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

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

Foo
只是一个对象,假设它没有扩展
线程
,您会期望什么?只要新线程没有
start()
ed,您就只是代表调用线程调用一个普通方法


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

Foo
只是一个对象,假设它不扩展
线程
,您会期望什么?只要新线程没有
start()
ed,您就只是代表调用线程调用一个普通方法


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

除了在启动线程时执行之外,
run()
是一种正常的方法。如果手动调用,它的行为与任何其他方法类似,这意味着它在调用方的线程内执行。

除了在启动线程时执行外,
run()
是一种正常的方法。如果手动调用,它的行为与任何其他方法类似,这意味着它在调用方的线程内执行。

它将在调用它的线程上运行。在扩展线程的类中调用方法与调用任何其他类的方法没有什么不同

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();        
     }
}

应打印“父项”

它将在调用它的线程上运行。在扩展线程的类中调用方法与调用任何其他类的方法没有什么不同

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();        
     }
}

应打印“父项”

我的意思是,一旦其他线程运行,是否有办法从一个线程调用另一个线程,但让被调用线程执行代码而不是调用线程?@grg-n-sox-根据定义不可能-您不能调用线程,只能发出信号。您可以得到的最接近的方法是将一个对象、代理或其他东西排队给另一个线程,并在其上设置Wait()。目标线程可以对对象执行一些工作并通知它。我的意思是,一旦其他线程运行,是否有办法从一个线程调用另一个线程,但让被调用线程执行代码而不是调用线程?@grg-n-sox-根据定义不可能-你不能调用线程,只能发出信号。您可以得到的最接近的方法是将一个对象、代理或其他东西排队给另一个线程,并在其上设置Wait()。目标线程可以对对象执行一些操作并通知它。