在一个简单易懂的解释中,什么是Java中的Runnable?

use*_*295 84 java runnable

用外行人的话来说,Java中的"runnable"是什么?我是高中的AP编程学生,他的任务是做研究,或者从别人那里寻找"runnable"是什么(我们刚刚进入OOP,还没有触及线程).

opa*_*tut 170

Runnable基本上是一种类(Runnable是一个接口),可以放入一个线程,描述线程应该做什么.

Runnable接口要求的类的实现方法run()如下所示:

public class MyRunnableTask implements Runnable {
     public void run() {
         // do stuff here
     }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

Thread t = new Thread(new MyRunnableTask());
t.start();
Run Code Online (Sandbox Code Playgroud)

如果你没有Runnable接口,那么负责在另一个线程中执行你的东西的Thread类就没有承诺run()在你的类中找到一个方法,所以你可能会遇到错误.这就是你需要实现界面的原因.

高级:匿名类型

请注意,您不需要像往常一样定义类,您可以执行所有内联:

Thread t = new Thread(new Runnable() {
    public void run() {
        // stuff here
    }
});
t.start();
Run Code Online (Sandbox Code Playgroud)

这与上面类似,只是你不创建另一个命名类.

  • 这是一个很好的答案,完全反驳了"无法以现有形式合理回答"这一问题的说法. (62认同)
  • 线程运行直到`run`方法完成,然后线程关闭.如果你想让一个线程反复运行,可以在`run`方法中放置一个循环. (5认同)
  • 或者简单地使用 Java 8 lambda 函数:`new Thread(() -> System.out.println("hello from other thread")).start();` (2认同)

Ale*_*man 8

Runnable 是一个定义如下的接口:

interface Runnable {
    public void run();
}
Run Code Online (Sandbox Code Playgroud)

要创建一个使用它的类,只需将类定义为 (public) class MyRunnable implements Runnable {

它甚至可以在不创建新线程的情况下使用.它基本上是您使用单个方法运行的基本接口,可以调用.

如果你创建一个带有runnable的新Thread作为它的参数,它将在一个新的Thread中调用run方法.

还应该注意,Threads实现Runnable,并且在创建新Thread时调用(在新线程中).默认实现只调用你在构造函数中传递的Runnable,这就是为什么你可以new Thread(someRunnable)不重写Thread的run方法.

  • @AlexColeman - 有一个很大的**差异.如果你扩展`Thread`线程池是很困难的,如果你没有实现线程池,你就会一直使用创建新线程的*重要*成本.相比之下,只实现`Runnable`意味着您可以轻松使用诸如`ThreadPoolExecutorService`或第三方线程池之类的东西. (3认同)