Lập trình đa luồng trong Java được tập trung xung quanh lớp java.lang.Thread. Lớp này cung cấp khả năng tạo các đối tượng của lớp Thread, mỗi đối tượng có luồng điều khiển riêng.
91
Java cung cấp hai cách tiếp cận để tạo đối tượng Thread. Trong cách thứ nhất, chúng ta có khai báo một lớp con của lớp Thread và ghi đè phương thức run() để thực hiện các công việc của luồng. Sau khi khởi tạo một đối tượng của lớp được tạo ra, phương thức
start() được gọi để bắt đầu thực thi các chuỗi lệnh của lớp con đó. Phương thức start()
là phương thức được kế thừa từ lớp Thread.
Với cách tạo Thread như trên có ưu điểm là đơn giản và dễ hiểu. Tuy nhiên nó có nhược điểm là yêu cầu các đối tượng Thread được tạo ra phải là lớp con của lớp Thread trong hệ thống phân cấp lớp. Như vậy chúng ta sẽ không sử dụng được cách này trong các ứng dụng Applet.
Một cách tiếp cận khác của Java để tạo các luồng nhằm giải quyết vấn đề trên là sử dụng lớp giao diện java.lang.Runnable. Giao diện Runnable bao gồm một phương thức duy nhất, phương thức run (), phải được ghi đè bởi lớp được tạo ra. Hình 6.1 mô tả cây giả phả của lớp Thread.
Hình 6. 1 Cây gia phải của lớp java.lang.Thread
Cách 1: Khai báo một lớp là lớp con của lớp trừu tượng Thread và cài đè phương thức run() của lớp Thread.
1. Khai báo 1 lớp mới kế thừa từ lớp Thread.
2. Override lại phương thức run() ở lớp này, những gì trong phương thức run() sẽ được thực thi khi luồng bắt đầu chạy. Sau khi luồng chạy xong tất cả các câu lệnh trong phương thức run thì luồng cũng tự hủy.
3. Tạo 1 thể hiện (hay 1 đối tượng) của lớp ta vừa khai báo.
4. Sau đó gọi phương thức start() của đối tượng này để bắt đầu thực thi luồng. Ví dụ 1:
Khai báo lớp SubThread kế thừa lớp Thread. Lớp SubThread được sử dụng để tạo các luồng con từ luồng luồng chính.
92
Tạo lớp ThreadDemo được kế thừa lớp Thread trong đó luồng ThreadDemo là luồng chính và luồng SubThread là luồng con :
93
Ví dụ 2 :
Cách 2: Khai báo một lớp là lớp implements của lớp Runnable.
1. Khai báo 1 lớp mới implements từ Interface Runnable
2. Override lại phương thức run() ở lớp này, những gì trong phương thức run() sẽ được thực thi khi luồng bắt đầu chạy. Sau khi luồng chạy xong tất cả các câu lệnh trong phương thức run thì luồng cũng tự hủy.
3. Tạo 1 thể hiện (hay 1 đối tượng) của lớp ta vừa khai báo. (VD : Tên đối tượng là r1)
4. Tạo 1 thể hiện của lớp Thread bằng phương thức khởi tạo: Thread(Runnable target) với Runnable target là đối tượng thuộc lớp được implements từ giao diện Runnable.
Ví dụ: Thread t1 = new Thread(r1); 5. Gọi phương thức start() của đối tượng t1.
94
Cách khai báo này được sử dụng trong trường hợp lớp của chúng ta đã kế thừa một lớp nào đó (ví dụ Applet, Frame,…). Khi đó lớp của chúng ta không thể kế thừa thêm lớp Thread mà sẽ là một lớp thực hiện của lớp Runnable.