Thread和Runnable对象的差异

时间:2013-12-06 19:25:34

标签: java multithreading

我找不到与此类似的问题,但如果这是重复的话我会道歉。

//do something

//start

new Thread(r).start();

    Runnable r = new Runnable() {
        public void run() {
            try{
                Thread.sleep(5000);
                //do something
            }
            catch(InterruptedException e){}
        }
    };//end new Runnable

我的问题是:我使用的是线程吗?还是只是一个可运行的对象?我不确定我是否提出了一个有意义的问题?

我是线程新手,但我对这段代码的理解是:我正在启动一个新线程,传递一个runnable对象,然后它开始重写run方法,在这种情况下线程会睡5秒然后做工作

4 个答案:

答案 0 :(得分:2)

Runnable接口只是声明了一个事实,即实现它的类能够在一个线程中执行,因此它提供了一个由外部线程调用和执行的接口,仅此而已。

Thread实现Runnable,因为它能够执行自己的run()方法,但Runnable通常没有与线程本身相关的任何内容。 Thread的默认run()没有做任何事情,这就是你通常扩展它并定义线程的特定行为的原因。

但只是为了澄清,ThreadPoolExecutor接受Runnable对象与Thread完全相同。它只是声明类定义确实可以运行(或可执行)的接口。

答案 1 :(得分:2)

是的,你正在使用一个线程。 您可以通过向其构造函数传递一个Runnable对象来创建它。

“我正在启动一个新线程,传递一个可运行的对象,它开始重写的run方法,在这种情况下,线程将休眠5秒然后才能工作。”

这是正确的,但缺少关键点:此run方法将在另一个/新Thread中执行,而不是在您创建的Thread对象上调用start()的Thread中执行。

答案 2 :(得分:2)

  1. 您创建了Runnable接口的新匿名实现。
  2. 此实现提供了在新Thread
  3. 中执行此实现时要执行的操作
  4. 您创建了一个新的Threadnew Thread(r))并将匿名实例传递给线程实例
  5. 当您开始执行线程(new Thread(r).start())时,jvm创建了一个新线程。这个新线程又调用了匿名Runnable实现的run()方法。

答案 3 :(得分:2)

Thread的实例(在第一行代码中创建)表示物理线程。当您调用start()时,JVM将生成一个新线程(使用操作系统本机方法执行此操作)并开始执行。

Runnable只是定义run()方法的接口(就像在第二行代码中那样)。如果将实现Runnable的任何对象传递给Thread构造函数,则该线程将运行run()方法中定义的代码。

Runnable非常轻量级,因为它们只定义了一个方法,而Thread s具有物理线程的重量级。

不建议直接创建Thread,因为这是一项昂贵的操作。我强烈建议您查看java Executors framework,因为它提供了一种灵活的方式来创建线程池并以RunnableCallable s的形式向他们提交任务。 Executors框架为线程重用提供了宝贵的工具。