Khi gọi start() trên thread, nó bắt đầu thực thi và run() được gọi bởi Java Virtual Machine (JVM). Nếu gọi trực tiếp run(), nó được xem như phương thức ghi đè bình thường của lớp thread (hoặc interface Runnable) và chạy trong ngữ cảnh luồng hiện tại, không phải luồng mới.
Ví dụ
public class CallRunMethodTest extends Thread {
@Override
public void run() {
System.out.println("In the run() method: " + Thread.currentThread().getName());
for(int i = 0; i < 5; i++) {
System.out.println("i: " + i);
try {
Thread.sleep(300);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
}
public static void main(String[] args) {
CallRunMethodTest t1 = new CallRunMethodTest();
CallRunMethodTest t2 = new CallRunMethodTest();
t1.run(); // gọi run() trực tiếp thay vì start()
t2.run(); // gọi run() trực tiếp thay vì start()
}
}
Trong ví dụ, hai thread được tạo và run() gọi trực tiếp thay vì start().
Kết quả
In the run() method: main i: 0 i: 1 i: 2 i: 3 i: 4 In the run() method: main i: 0 i: 1 i: 2 i: 3 i: 4