Thread Trong JAVA-Part 3


Bài 3: Tìm Hiểu Một Số Phương Thức Hữu Dụng

1.Phương thức sleep()

Thread.sleep làm cho thread hiện hành đình chỉ thực hiện trong một thời gian quy định. Đây là một phương tiện hiệu quả làm cho thời gian xử lý đối với các thread khác của một ứng dụng hoặc các ứng dụng khác mà có thể được chạy trên một hệ thống máy tính. Phương thức sleep() cũng có thể được sử dụng cho pacing, như trong ví dụ sau đây, và chờ đợi một thread với nhiệm vụ được hiểu là có yêu cầu về thời gian, như với ví dụ SleepMessages ở bên dưới.

Có 2 overload của phương thức sleep() được cung cấp: một xác định thời gian sleep tính bằng mili giây và một xác định thời gian sleep bằng nano giây. Tuy nhiên, những kiểu thời gian này không đảm bảo chính xác, bởi chúng được giới hạn bởi những cơ sở nằm bên dưới hệ điều hành. Ngoài ra, thời gian sleep có thể được kết thúc bởi interrupt, mà chúng ta sẽ giới thiệu trong phần sau. Trong mọi trường hợp, bạn không thể giả định rằng việc gọi phương thức sleep sẽ đình chỉ thread về khoảng thời gian chính xác cho trước.

Ví dụ SleepMessages sử dụng phương thức sleep() để in message sau 4 giây:

public class SleepMessages {    
public static void main(String args[]) throws InterruptedException {
     String importantInfo[] = {"Mares eat oats","Does eat oats","Little lambs eat ivy",            "A kid will eat ivy too"};        
      for (int i = 0; i < importantInfo.length; i++) {
           //Pause for 4 seconds            
           Thread.sleep(4000);            
           //Print a message            
           System.out.println(importantInfo[i]);        
      }    
   }
}

Chú ý: phương thức main() ném một exception là InterruptedException. Đây là exception mà phương thức sleep() sẽ ném nếu một thread khác ngắt thread hiện hành trong khi sleep() đang kích hoạt. Nếu ứng dụng không định nghĩa một thread khác để làm gián đoạn(interrupt), thì không cần bận tâm tới InterruptedException.

2.Phương thức wait() và notify()

Cơ chế chiếm dụng đồng bộ hóa ngăn cho các tuyến đoạn chồng chéo nhau. Nhưng trong một số trường hợp ta cũng cần phải cung cấp một cách nào đó để các tuyến đoạn truyền tin với nhau. Java cung cấp cho người sử dụng các phương thức cho phép các tuyến đoạn không bị xử lý chồng chéo mà vẫn có thể trao đổi thông tin với nhau bằng cách sử dụng các phương thức wait() và notify(). Để thực hiện điều này phương thức wait() được định nghĩa để cho phép một tuyến đoạn đợi cho tới khi một điều kiện nào đó xảy ra. Phương thức notify() được định nghĩa để báo cho các tuyến đoạn biết sự kiện nào đó đã xảy ra. Các phương thức này được định nghĩa trong lớp Object và được thừa kế từ các lớp Object.

Ta tìm hiểu ví dụ sau :

public class WaitNotify extends Thread {

public static void main(String args[]) throws Exception{

Thread notificationThread = new WaitNotify();
notificationThread.start();
// Chờ tuyến đoạn cảnh báo kích hoạt sự kiện
synchronized (notificationThread){
notificationThread.wait();
}

// Báo cho người dùng biết phương thức wait đã hoàn thành
System.out.println (“The wait is over”);
}

public void run(){

System.out.println (“Hit enter to stop waiting thread”);
try {
System.in.read();
} catch (java.io.IOException ioe){
// no code req’d
}

// Notify any threads waiting on this thread
synchronized (this){
this.notifyAll();
}
}

}

Một số dạng của phương thức wait và notify

Tất cả các phương thức đều có trong lớp Object và hoạt động trên đối tượng hiện thời:

•  public final void wait(long timeout) throws InterruptedException

Tuyến  đoạn hiện thời chờ cho tới khi  được cảnh báo hoặc một khoảng thời gian timeout nhất định. Nếu timeout bằng 0 thì phương thức sẽ chỉ chờ cho tới khi có cảnh báo về sự kiện.

•  public final void notify()

Cảnh báo ít nhất một tuyến đoạn đang chờ một điều kiện nào đó thay đổi. Các tuyến đoạn phải chờ một điều kiện thay đổi trước khi có thể gọi phương thức wait nào đó.

•  public final void notifyAll()

Phương thức này cảnh báo tất cả các tuyến đoạn đang chờ một điều kiện thay đổi.Các tuyến đoạn đang chờ thường chờ một tuyến đoạn khác thay đổi điều kiện nào đó. Trong số các tuyến đoạn đã được cảnh báo, tuyến đoạn nào có độ ưu tiên cao nhất thì sẽ chạy trước tiên.

3.Một số phương thức về Interrupting Thread

    • Một Thread được xem là kết thúc khi phương thức run() của nó được trả về.
  • Không có cách nào để bắt buộc một Thread kết thúc. Tuy nhiên, phương thức interrupt() có thể được sử dụng để yêu cầu một Thread kết thúc.
  • Khi một Thread gọi phương thức interrupt(), trạng thái interrupted của Thread được thiết lập. Đó là môt flag biểu Boolean đại diện cho mỗi Thread. Thỉnh thoảng, mỗi Thread phải tự kiểm tra xem nó đã bị interrupted hay chưa. Một số phương thức interrupt của Thread:
      • void interrupt():

Gửi một request interrupt vào Thread. Trạng thái interrupted của Thread sẽ được thiết lập = true. Phương thức này đơn giãn set flag trong Thread đích để cho biết rằng nó đã bị interrupted và đã được return. Phương thức này có thể ném một ngoại lệ SecurityException, để cho biết rằng Thread yêu cầu interrupted không có quyền interrupt Thread khác.

Ví dụ:

1: public class SleepInterrupt extends Object implements Runnable {

2:     public void run() {

3:         try {

4:             System.out.println(

5:                     “in run() – about to sleep for 20 seconds”);

6:             Thread.sleep(20000);

7:             System.out.println(“in run() – woke up”);

8:         } catch ( InterruptedException x ) {

9:             System.out.println(

10:                     “in run() – interrupted while sleeping”);

11:             return;

12:         }

13:

14:         System.out.println(“in run() – doing stuff after nap”);

15:         System.out.println(“in run() – leaving normally”);

16:     }

17:

18:

19:     public static void main(String[] args) {

20:         SleepInterrupt si = new SleepInterrupt();

21:         Thread t = new Thread(si);

22:         t.start();

23:

24:         // Be sure that the new thread gets a chance to

25:         // run for a while.

26:         try { Thread.sleep(2000); }

27:         catch ( InterruptedException x ) { }

28:

29:         System.out.println(

30:                 “in main() – interrupting other thread”);

31:         t.interrupt();

32:         System.out.println(“in main() – leaving”);

33:     }

34: }

Kết quả:

in run() – about to sleep for 20 seconds

in main() – interrupting other thread

in main() – leaving

in run() – interrupted while sleeping

  • static boolean  interrupted():

Kiểm tra trạng thái interrupted của Thread hiện tại. Lưu ý đây là phương thức static. Phương thức này trả về true nếu Thread hiện tại đã bị interrupted và flag interrupted vẫn chưa được clear. Gọi Thread.interrupted() là một cách thứ 2 để trả về false cho đến khi Thread đã bị reinterrupted.

Ví dụ:

1: public class InterruptReset extends Object {

2:     public static void main(String[] args) {

3:         System.out.println(

4:             “Point X: Thread.interrupted()=” + Thread.interrupted());

5:         Thread.currentThread().interrupt();

6:         System.out.println(

7:             “Point Y: Thread.interrupted()=” + Thread.interrupted());

8:         System.out.println(

9:             “Point Z: Thread.interrupted()=” + Thread.interrupted());

10:     }

11: }

Kết quả:

Point X: Thread.interrupted()=false

Point Y: Thread.interrupted()=true

Point Z: Thread.interrupted()=false

Ban đầu, tại điểm X, trạng thái interrupted = false, sau đó Thread hiện tại bị interrupt tại dòng(5). Tại Y, trạng thái interrupted = true, và nó tự động reset lại = false bởi Thread.interrupted() (dòng 6-7 ). Cuối cùng, kiểm tra trạng thái tại Z và kết quả bằng false.

  • boolean isInterrupted():

Kiểm tra xem Thread này đã bị interrupt hay chưa. Gọi phương thức này không ảnh hưởng đến trạng thái interrupt của Thread này.

Bạn thấy bài viết này thế nào?

One Response to “Thread Trong JAVA-Part 3”

  1. Swing in Java « Thái Hoàng Hải Says:

    […] : Part 1 , Part 2, Part 3 , Part 4, Part […]


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: