在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()。目标线程可以对对象执行一些操作并通知它。