Chuyện gì xảy ra khi gọi trực tiếp phương thức run() thay vì phương thức start()
- Mỗi thread start trong một call stack riêng biệt.
- Việc gọi phương thức run() từ luồng chính, phương thức run() được xếp vào call stack chứ không phải khởi tạo một call stack mới.
class TestCallRun1 extends Thread {
public void run() {
System.out.println("running...");
}
public static void main(String args[]) {
TestCallRun1 t1 = new TestCallRun1();
t1.run(); // ok, nhung khong start mot call stack rieng biet
}
}
Output:
running...
Vấn đề khi gọi trực tiếp phương thức run()
class TestCallRun2 extends Thread {
public void run() {
for (int i = 1; i < 5; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
System.out.println(e);
}
System.out.println(i);
}
}
public static void main(String args[]) {
TestCallRun2 t1 = new TestCallRun2();
TestCallRun2 t2 = new TestCallRun2();
t1.run();
t2.run();
}
}
Output:
1 2 3 4 1 2 3 4
Như bạn thấy trong chương trình trên, không có sự chuyển đổi ngữ cảnh vì ở đây t1 và t2 sẽ được coi như đối tượng thông thường chứ không phải đối tượng luồng.