假设我们有两个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();
}

当前回答

T.start()是标准库为您的代码提供的方法,当您需要一个新线程时可以调用它。

R.run()是为库在新线程中调用提供的方法。


这些答案大多数都忽略了一个大问题,即就Java语言而言,t.t start()和r.r run()之间的差异并不比其他任何两个方法之间的差异大。

它们都是方法。它们都运行在调用它们的线程中。它们都做它们被编码要做的事情,然后它们都返回给它们的调用者,仍然在同一个线程中。

最大的区别是t.t start()的大部分代码是本地代码,而在大多数情况下,r.r run()的代码将是纯Java。但这并没有太大的区别。代码就是代码。原生代码更难找到,找到后也更难理解,但它仍然只是告诉计算机该做什么的代码。

那么,t.start()做什么呢?

它创建了一个新的本机线程,它安排该线程调用t.run(),然后它告诉操作系统让新线程运行。然后它又回来了。

r.run()做什么?

有趣的是,问这个问题的人正是写这个问题的人。r.r run()执行您(即编写它的开发人员)设计它要执行的任何操作。

其他回答

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

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

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

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

如果直接调用run(),它将在调用线程上执行,就像任何其他方法调用一样。需要thread .start()来实际创建一个新线程,以便并行执行可运行对象的run方法。

如果你在main方法中执行run(), main方法的线程将调用run方法,而不是你需要运行的线程。

start()方法创建了新的线程,run()方法必须为此执行

实际上,thread .start()创建了一个新线程,并有自己的执行场景。

Thread.start()异步调用run()方法,将新线程的状态更改为Runnable。

但是thread. run()不会创建任何新的线程。相反,它在当前运行的线程中同步执行run方法。

如果你正在使用Thread.run(),那么你根本就没有使用多线程的特性。