Java: Định nghĩa và khởi tạo Thread
Mỗi luồng được liên kết với một thể hiện (đối tượn) của lớp Thread
. Có hai chiến lược cơ bản để sử dụng các đối tượng Thread
để tạo một ứng dụng đồng thời:
- Để kiểm soát trực tiếp việc tạo và quản lý luồng, chỉ cần khởi tạo
Thread
mỗi khi ứng dụng cần bắt đầu một tác vụ không đồng bộ. - Để quản lý luồng trừu tượng từ phần còn lại của ứng dụng của bạn, hãy chuyển các nhiệm vụ của ứng dụng cho trình thực thi (executer).
Bài học này sẽ nói về việc sử dụng các đối tượng Thread
. Các trình thực thi sẽ được thảo luận ở bài viết Executor.
Mỗi ứng dụng tạo ra một thể hiện của Thread sẽ phải cung cấp mã lệnh để chạy trong luồng đó. Có hai cách để làm điều này:
- Cung cấp một đối tượng
Runnable
. Interface Runnable định nghĩa một phương thức duy nhất là phương thức run(), nó chứa mã thực thi luồng. Đối tượng Runnable được truyền tới hàm tạo Thread, như trong ví dụ HelloRunnable dưới đây:
public class HelloRunnable implements Runnable { public void run() { System.out.println("Hello from a thread!"); } public static void main(String args[]) { (new Thread(new HelloRunnable())).start(); } }
- Lớp con Thread. Lớp Thread bản thân nó thực thi
Runnable
mặc dù phương thức run() của nó không làm gì. Một ứng dụng có thể phân lớp Thread, cung cấp sự thực thi phương thức run() của riêng nó, như trong ví dụ sau:
public class HelloThread extends Thread { public void run() { System.out.println("Hello from a thread!"); } public static void main(String args[]) { (new HelloThread()).start(); } }
Chú ý rằng cả hai ví dụ trên đều gọi phương thức Thread.start
để tạo một luồng mới.
Vậy bạn nên sử dụng cách nào? Đối với cách thứ nhất, đối tượng Runnable mang tính tổng quát hơn, Runnable có thể phân lớp thành một lớp khác so với Thread. Nhưng cách thứ hai lại dễ dàng sử dụng hơn trong các ứng dụng đơn giản, nhưng bị hạn chế bởi thực tế là lớp tác vụ của bạn phải là một lớp con của Thread. Bài những bài viết trong phần này tập trung vào phương pháp tiếp cận đầu tiên, tách tác vụ Runnable
khỏi đối tượng Thread, bởi vì phương pháp này linh hoạt hơn, nó còn được áp dụng cho các API quản lý luồng cấp cao sau này.
Lớp Thread
lớp định nghĩa một số phương thức hữu ích cho việc quản lý luồng. Chúng bao gồm các phương thức static
, cung cấp thông tin về hoặc ảnh hưởng đến trạng thái của luồng gọi phương thức. Các phương thức khác nhau được gọi từ các luồng khác nhau liên quan đến việc quản lý luồng và đối tượng Thread
. Ta sẽ xem xét một số phương thức này trong các phần sau.