假设我们有两个Runnables:

class R1 implements Runnable {
    public void run() { … }
    …
}

class R2 implements Runnable {
    public void run() { … }
    …
}

那么这两者的区别是什么呢:

public static void main() {
    R1 r1 = new R1();
    R2 r2 = new R2();

    r1.run();
    r2.run();
}

这:

public static void main() {
    R1 r1 = new R1();
    R2 r2 = new R2();
    Thread t1 = new Thread(r1);
    Thread t2 = new Thread(r2);

    t1.start();
    t2.start();
}

当前回答

成员们提出的观点都是对的所以我想补充一点。问题是JAVA不支持多继承。但是如果你想从另一个类a中派生一个类B,但你只能从一个类中派生。现在的问题是如何从这两个类中“派生”:A和Thread。因此,您可以使用可运行接口。

public class ThreadTest{
   public void method(){
      Thread myThread = new Thread(new B());
      myThread.start;
   }
}

public class B extends A implements Runnable{...

其他回答

区别在于thread. start()启动一个调用run()方法的线程,而Runnable.run()只调用当前线程上的run()方法。

Thread.start()代码向调度器注册线程,调度器调用run()方法。同样,Thread是类,而Runnable是接口。

调用run()在调用线程上执行,就像任何其他方法调用一样。而thread. start()创建一个新线程。 调用run()是一个编程错误。

Thread类中单独的start()和run()方法提供了两种创建线程程序的方法。start()方法启动新线程的执行,并调用run()方法。start()方法立即返回,新线程通常会继续,直到run()方法返回。

Thread类的run()方法什么也不做,所以子类应该用在第二个线程中执行的代码重写该方法。如果一个线程是用Runnable参数实例化的,线程的run()方法会在新线程中执行Runnable对象的run()方法。

根据线程程序的性质,直接调用Thread run()方法可以得到与通过start()方法调用相同的输出,但在后一种情况下,代码实际上是在一个新线程中执行的。

在第一种情况下,您只是调用r1和r2对象的run()方法。

在第二种情况下,您实际上创建了2个新线程!

Start()会在某个时刻调用run() !