用简单易懂的语言解释,什么是Java中的Runnable?

118

"Runnable"在Java中是什么意思?以通俗易懂的方式解释。我是一名高中AP编程学生,我的作业是研究或向他人了解什么是“runnable”(我们刚刚开始学习面向对象编程,还没有涉及到线程)。

在Java中,“Runnable”是一个接口(interface),它表示一个可以运行的代码块,但是它本身不能直接运行。为了运行一个“Runnable”,需要使用Thread类来创建一个线程并将其传递给Thread的构造方法。这样,该线程就可以运行“Runnable”中的代码块。

API文档中只有一行有用的信息:“方法run的一般契约是它可以采取任何行动。” - Tom Hawtin - tackline
一个更有趣的研究任务是:用通俗易懂的语言解释Java中的“可停止”是什么。现在的教练们... - Udo Klimaschewski
9
@UdoKlimaschewski这个人是一位高中学生,不是本科或研究生。我认为这位教师的期望与学生的水平相称。然而,我同意“首先在SO上询问”并不适用于OP这个水平的人,这不是一个合适的研究技巧。 - Stephen C
2个回答

222

可运行体(Runnable)基本上是一种可以放置在线程中的类(Runnable是一个接口),描述了线程应该做什么。

Runnable接口要求类实现像这样的run()方法:

public class MyRunnableTask implements Runnable {
     public void run() {
         // do stuff here
     }
}

然后就像这样使用它:

Thread t = new Thread(new MyRunnableTask());
t.start();

如果没有Runnable接口,执行其他线程的Thread类将无法保证在您的类中找到run()方法,因此可能会出现错误。这就是为什么您需要实现该接口的原因。
高级:匿名类型
请注意,您不需要像通常一样定义一个类,您可以在内联中完成所有操作。
Thread t = new Thread(new Runnable() {
    public void run() {
        // stuff here
    }
});
t.start();

这与上述类似,只是您不需要创建另一个命名类。

83
这是一个很好的答案,完全驳斥了声称这个问题“在当前形式下无法得到合理回答”的说法。 - Russell Silva
1
我知道已经很久了,但我有一个问题。当我启动一个线程时,它只运行一次还是在程序内部不断运行? - gamo
5
线程运行直到run方法完成,然后线程关闭。如果您希望线程一遍又一遍地运行,请在run方法中放置一个循环。 - opatut
2
或者简单地使用Java 8的lambda函数:new Thread(() -> System.out.println("hello from other thread")).start(); - Gabe

12

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

interface Runnable {
    public void run();
}

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

甚至可以不创建新线程就可使用它。它基本上是具有单个方法(run)的基本接口,该方法可以被调用。

如果使用runnable作为参数创建新线程,则会在新线程中调用run方法。

还应注意到线程实现了Runnable,当新线程创建时(在新线程中),就会调用这个接口。默认实现只调用您在构造函数中传递的任何Runnable,这就是为什么您可以只执行new Thread(someRunnable)而无需覆盖Thread的run方法。


你是说继承Thread和实现Runnable基本上没有区别吗?使用Runnable时,Thread是作为包装器和执行器使用的吗? - opatut
我想说的是,在[扩展Thread和覆盖run]与[创建一个具有相同run方法的可运行线程的新实例]之间没有区别。 - Alex Coleman
是的,我明白了。但是真的没有任何区别吗,无论是性能还是其他方面? - opatut
3
@AlexColeman - 这有很大的区别。如果你扩展Thread,线程池会很困难,而如果不实现线程池,则需要显著付出创建新线程的成本。 相比之下,只需实现Runnable就可以轻松使用诸如ThreadPoolExecutorService或第三方线程池等工具。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接