【问题标题】:All methods in runnable class run on a seperate thread or only run() method? Java可运行类中的所有方法都在单独的线程上运行还是仅在 run() 方法上运行?爪哇
【发布时间】:2022-01-01 23:00:41
【问题描述】:

假设我有一个具有两种方法的可运行类:

class ExampleClass implements Runnable { 

public void shutdown()
{
currentThread().interrupt();
}
 
public void run(){
while(!currentThread().isInterrupted()){  
System.out.println("thread is running...");  
}

}

然后我去像这样在某个地方实现这个类并将它传递给一个线程:

ExampleClass object = new ExampleClass();
Thread sideThread = new Thread( object, "Side Thread");
thread.start();
object.shutdown();

所有这些object 和它的所有方法会在sideThread 上运行还是只是在side thread 上object 的run() 方法?

即当我调用 shutdown() 时,它实际上会中断 sideThread 还是只会在实例化对象的主线程上中断?

【问题讨论】:

  • run() 仅在您编写代码时在单独的线程上运行。 run() 可以并且经常在同一个线程上调用。这不是魔法,它只是一种方法。

标签: java multithreading runnable


【解决方案1】:

Runnable 没有额外的魔法。 Thread 接受 Runnable 并在新线程上调用其 run 方法。故事结局。该对象上的任何其他方法都与Thread 无关。如果您想在调用线程和创建的线程之间提供更紧密的集成,那就由您来设计。

【讨论】:

    【解决方案2】:

    Silvio Mayolo says 是正确的,任何线程都可以调用对象的任何方法,将 Runnable 传递给线程的构造函数告诉线程执行该 Runnable 的 run 方法。如果你愿意,你可以将实现 Runnable 的同一个对象传递给几个新线程并让它们都运行它。这里没有魔法。

    当您调用Thread.currentThread() 时,将返回正在执行代码的线程。因此,当您发布的代码现在可以正常工作时,如果 1) 线程 A 启动一个新线程 B,传入此 Runnable,然后 2) 线程 A 在 Runnable 上调用 shutdown,结果是在线程 A 上设置了中断标志,而不是在线程 B 上,执行 run 方法的线程 B。可能不是你想要的。最好保留对新线程的引用,并在其上调用中断。

    每个线程都会为其生成一个名称。尝试添加一些行,例如:

    System.out.println("thread=" + Thread.currentThread().getName());
    

    在您的代码中,它将显示正在执行的线程。您将看到新线程正在执行 run 方法,而创建新线程的线程正在运行 shutdown 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      相关资源
      最近更新 更多