用一个简单易懂的解释,Java中的Runnable是什么?[关闭]


92

用外行的话来说,Java中的“可运行”是什么?我是一名高中的AP编程学生,其任务是进行研究或从他人那里寻找“可运行的”是什么(我们只是进入OOP,并且还没有接触过线程)。


API文档中只有一条有用的代码:“方法运行的一般约定是,它可以采取任何措施。”
汤姆·霍顿

一个更有趣的研究任务应该是:用外行的话来说,Java中什么是“可停止的”。今天的教练是如此……
Udo Klimaschewski 2012年

8
@UdoKlimaschewski -这个家伙是一个高中学生,没有一个本科生或研究生。这名教师的期望与学生的水平... IMO相称。但是,我同意“对SO的首先询问”对于OP级别的人员而言不是适当的研究技术。
斯蒂芬·C

Answers:


188

从本质上讲,Runnable是一种类的类型(Runnable是一个Interface),可以将其放入线程中,以描述该线程应该做什么。

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

这与上面的类似,只是您没有创建另一个命名类。


67
这是一个很好的答案,完全驳斥了“无法以当前形式合理地回答”这个问题的说法。
拉塞尔·席尔瓦

1
我知道已经很长时间了,但是我有一个问题。线程仅运行一次,还是在启动线程时在程序内部不断运行?
加莫2014年

5
线程将一直运行到run方法完成为止,然后关闭线程。如果要让线程反复运行,请在run方法内部放置一个循环。
opatut 2014年

2
或仅使用Java 8 lambda函数:new Thread(() -> System.out.println("hello from other thread")).start();
Gabe

9

Runnable 是这样定义的接口:

interface Runnable {
    public void run();
}

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

无需创建新线程即可使用它。基本上,这是您可以通过调用一个方法运行的基本接口。

如果使用参数runnable创建新线程,它将在新线程中调用run方法。

还应注意,线程实现Runnable,并且在创建新线程(在新线程中)时调用。默认实现只是调用您传递给构造函数的任何Runnable,这就是为什么您可以在new Thread(someRunnable)不重写Thread run方法的情况下进行操作的原因。


您是说继承Thread或实现Runnable基本没有区别吗?使用Runnable用作包装程序和执行程序时,线程是否被使用?
opatut,2012年

我是说[扩展线程并覆盖运行]与[使用具有相同运行方法的可运行对象创建线程的新实例]之间没有区别
Alex Coleman

是的 但是,真的没有区别,无论是性能还是其他方面?
opatut

3
@AlexColeman-有很大的不同。如果扩展Thread线程池是困难的,如果你不执行的线程池你穿的显著创建新线程所有的时间成本。相比之下,仅实现就Runnable意味着您可以轻松使用诸如ThreadPoolExecutorService第三方线程池之类的东西。
斯蒂芬·C
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.