Một chương trình trong java có thể có 1 hoặc nhiều hơn các thread chạy bên trong. Mỗi thread đều có các nhiệm vụ khác nhau và chúng thực thi độc lập. Vậy có bao giờ các bạn tự đặt ra câu hỏi lúc chạy chương trình thì có thread nào được tạo hay không? ai tạo ra nó? và tạo sao hàm main() luôn được chạy đầu tiên và tự động trong khi các method khác chúng ta phải gọi mới thực thi? Chúng ta sẽ cùng nhau tìm hiểu trong bài viết này nhé.
Main thread trong java
Khi một chương trình java khởi chạy, một thread sẽ được khởi tạo bởi JVM được gọi là Main thread, ngoài ra các daemon thread cũng được tạo để thực thi các nhiệm vụ nhất định như dọn rác etc.
Khi Main thread được tạo, nó sẽ đi tìm main() method để thực thi, nếu nó không tìm thấy main method thì chương trình sẽ bị báo lỗi không tìm thấy main() method.
Chúng ta có thể sử dụng currentThread() method để lấy instance của Main thread ngay tại hàm main(). Từ đây chúng ta có thể thực hiện một số tác vụ chuyển đổi main thread như là đổi tên, gán độ ưu tiên etc.
class Test extends Thread { public static void main(String[] args) { // getting reference to Main thread Thread t = Thread.currentThread(); // getting name of Main thread System.out.println("Current thread: " + t.getName()); // doi ten thread t.setName("Shareprogramming.net"); System.out.println("After name change: " + t.getName()); // Kiem tra do uu tien cua main thread System.out.println("Main thread priority: "+ t.getPriority()); // thay doi gia tri do uu tien cua main thread t.setPriority(MAX_PRIORITY); System.out.println("Main thread new priority: "+ t.getPriority()); for (int i = 0; i < 5; i++) { System.out.println("Main thread"); } // Khoi tao childthread con cua main thread ChildThread ct = new ChildThread(); System.out.println("Child thread priority: "+ ct.getPriority()); ct.setPriority(MIN_PRIORITY); System.out.println("Child thread new priority: "+ ct.getPriority()); ct.start(); } } class ChildThread extends Thread { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("Child thread"); } } }
Output:
Current thread: main
After name change: Shareprogramming.net
Main thread priority: 5
Main thread new priority: 10
Main thread
Main thread
Main thread
Main thread
Main thread
Child thread priority: 10
Child thread new priority: 1
Child thread
Child thread
Child thread
Child thread
Child thread
DeadLock trong main thread
Chúng ta có thể tạo ra Deadlock chỉ trong một main thread bằng cách gọi join() method cho main thread.
public class Test { public static void main(String[] args) { try { System.out.println("Entering into Deadlock"); Thread.currentThread().join(); // the following statement will never execute System.out.println("This statement will never execute"); } catch (InterruptedException e) { e.printStackTrace(); } }
Khi join() method được gọi bởi Thread.currentThread() chính là main thread sẽ bảo các thread khác chờ cho đến khi nó thực thi xong. Như vậy sẽ xảy ra tình trạng main thread chờ chính nó và dẫn đến deadlock.