【问题标题】:In Java, if I call a class that extends Thread from another runnable object, which Thread executes?在 Java 中,如果我调用一个从另一个可运行对象扩展 Thread 的类,哪个 Thread 执行?
【发布时间】:2012-04-19 19:21:41
【问题描述】:

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

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

【问题讨论】:

    标签: java multithreading concurrency thread-safety


    【解决方案1】:

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

    【讨论】:

    • 我的意思是一旦其他线程正在运行,有没有办法从一个线程调用另一个线程,但让被调用者线程执行代码而不是调用者线程?
    • @grg-n-sox - 根据定义不可能 - 您不能调用线程,只能发出信号。您可以获得的最接近的方法是将对象或代理或其他东西排队到另一个线程上的 Wait() 。目标线程可以在对象上做一些工作并 Notify() 它。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        应该打印'父';

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-26
          • 1970-01-01
          • 2011-03-31
          相关资源
          最近更新 更多