Điều khiển cỏc thread

Một phần của tài liệu Bài giảng ngôn ngữ lập trình Java doc (Trang 138 - 141)

Sau khi đó khởi động được một thread rồi, vấn đề tiếp theo sẽ là điều khiển thread.

IV.1 Interrupt một thread

Khi sử dụng phương thức Thread.sleep(int) thỡ chương trỡnh thường phải bắt cỏc ngoại lệ để xử lý. Lý do là thread bị dừng lại trong một khoảng thời gian lõu và trong khoảng thời gian đú nú khụng thể tự đỏnh thức nú được. Tuy nhiờn, nếu một thread cần phải được đỏnh thức sớm hơn, ta cú thể ngắt nú dựng phương thức interrupt().

public class SleepyHead extends Thread {

// Phương thức được chạy khi thread khởi động lần đầu public void run()

{

System.out.println ("Thread đang ngủ. Hóy đỏnh thức nú"); try

{

// Ngủ trong 8 tiếng

Thread.sleep( 1000 * 60 * 60 * 8 );

System.out.println ("Đú là một giấc ngủ trưa"); }

catch (InterruptedException ie) {

System.err.println ("Chỉ mới được hơn 5 phỳt thụi...."); }

}

// Phương thức main tạo và bắt đầu thread public static void main(String args[]) throws java.io.IOException

{

// Tạo một thread

// bắt đầu thread sleepy.start();

// Nhắc người dựng để dừng thread

System.out.println ("Nhấn Enter để ngưng thread"); System.in.read();

// Ngắt thread sleepy.interrupt(); }}

Cỏch thực hiện ở đõy là gửi một thụng điệp từ một thread khỏc để đỏnh thức một thread đang ngủ. Ở đõy, thread chớnh- hàm main- sẽ đợi cho người dựng ấn enter, sau đú gửi một thụng điệp ngắt tới thread đang ngủ.

IV.2 Dừng một thread

Đụi khi ta muốn một thread dừng lại trước khi nhiệm vụ của nú hoàn thành. Một thread (gọi là thread điều khiển) cú thể gửi một thụng điệp dừng tới một thread khỏc bằng việc gọi phương thức Thread.stop(). Điều này yờu cầu thread điều khiển phải giữ một tham chiếu tới thread muốn dừng.

public class StopMe extends Thread {

// Phương thức được thực hiện khi thread khởi động lần đầu public void run()

{

int count = 1;

System.out.println ("Thread đếm!"); for (;;)

{

// In ra biến count và tăng giỏ trị cho nú System.out.print (count++ + " "); // Ngủ nửa giõy

try { Thread.sleep(500); } catch (InterruptedException ie) {} }}

// phương thức main

public static void main(String args[]) throws java.io.IOException {

// Tạo và bắt đầu thread

Thread counter = new StopMe(); counter.start(); // Nhắc người dựng System.out.println ("Nhấn Enter để dừng đếm"); System.in.read(); // Dừng thread counter.stop(); }} 139

IV.3 Tạm dừng và phục hồi một thread

Cỏc phương thức suspend() dựng để tạm dừng một thread trong khi resume() dựng để tiếp tục một thread đó bị suspend. Tuy nhiờn sử dụng cỏc thread này rất hay gõy ra tỡnh trạng deadlock do thread bị suspend đang chiếm giữ một tài nguyờn và khụng giải phúng trong khi nhiều thread khỏc cú thể đang đợi sử dụng tài nguyờn đú.

IV.4 Giải phúng thời gian cho CPU

Khi một thread rơi vào trạng thỏi đợi một sự kiện xảy ra hoặc đi vào một vựng mó lệnh mà nếu giải phúng thời gian cho CPU sẽ nõng cao hiệu quả của hệ thống. Trong trường hợp này, thread nờn giải phúng thời gian hệ thống hơn là dựng sleep() để nghỉ trong thời gian dài. Để làm điều này ta dựng phương thức static yield() của Thread để giải phúng thời gian CPU cho thread hiện thời. Ta khụng thể giải phúng thời gian CPU của bất kỳ thread nào mà chỉ đối với thread hiện thời.

IV.5 Đợi một thread kết thỳc cụng việc

Đụi khi ta cần đợi cho một thread kết thỳc một cụng việc nào đú như gọi một phương thức hay đọc một thuộc tớnh thành phần,…Ta dựng phương thức isAlive() để xỏc định thread cũn chạy khụng. Tuy nhiờn, nếu thường xuyờn dựng phương thức này để kiểm tra sau đú dựng sleep() hoặc yield() thỡ hiệu quả sử dụng CPU sẽ rất thấp. Một cỏch hiệu quả là gọi phương thức joint() để đợi một thread kết thỳc cụng việc.

public class WaitForDeath extends Thread {

// Phương thức run() public void run() {

System.out.println ("thread chuẩn bị nghỉ...."); // Nghỉ trong 5 giõy

try {

Thread.sleep(5000); }

catch (InterruptedException ie) {} }

// phương thức main

public static void main(String args[]) throws java.lang.InterruptedException

{

// Tạo thread

Thread dying = new WaitForDeath(); dying.start();

// Nhắc user

System.out.println ("Đợi cho thread kết thỳc"); dying.join();

Một phần của tài liệu Bài giảng ngôn ngữ lập trình Java doc (Trang 138 - 141)