Вопрос-ответ

What's the difference between Thread start() and Runnable run()

В чем разница между Thread start() и Runnable run()

Допустим, у нас есть эти две 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();
}
Переведено автоматически
Ответ 1

Первый пример: Нет нескольких потоков. Оба выполняются в одном (существующем) потоке. Нет создания потока.

R1 r1 = new R1();
R2 r2 = new R2();

r1 и r2 - это всего лишь два разных объекта классов, которые реализуют Runnable интерфейс и, таким образом, реализуют run() метод. При вызове r1.run() вы выполняете его в текущем потоке.

Второй пример: два отдельных потока.

Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);

t1 и t2 являются объектами класса Thread. Когда вы вызываете t1.start(), он запускает новый поток и вызывает run() метод r1 внутренне, чтобы выполнить его в этом новом потоке.

Ответ 2

Если вы просто вызываете run() напрямую, это выполняется в вызывающем потоке, как и любой другой вызов метода. Thread.start() требуется фактически создать новый поток, чтобы run метод runnable выполнялся параллельно.

Ответ 3

Разница в том, что Thread.start() запускает поток, который вызывает run() метод, в то время как Runnable.run() просто вызывает run() метод в текущем потоке.

Ответ 4

The difference is that when program calls start() method, a new thread is created and code inside run() is executed in the new thread: while if you call run() method directly, no new thread will be created and code inside run() will execute in the current thread directly.

Another difference between start() and run() in Java thread is that you cannot call start() twice. Once started, second start() call will throw IllegalStateException in Java while you can call run() method several times since it's just an ordinary method.

java multithreading concurrency