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.