Thứ Sáu, 19 tháng 4, 2024

Thread

 



Trong đoạn mã bạn đã cung cấp, t1t2 là hai đối tượng của lớp TestInterruptingThread4, mỗi đối tượng này là một luồng riêng biệt. Khi bạn gọi phương thức t1.interrupt(), nó gửi một tín hiệu gián đoạn (interrupt signal) đến luồng t1.

Trong phương thức run() của lớp TestInterruptingThread4, ta có một vòng lặp với 2 lượt. Mỗi lần lặp, chúng ta kiểm tra xem luồng hiện tại đã nhận được tín hiệu gián đoạn chưa bằng cách sử dụng Thread.interrupted(). Nếu luồng đã nhận được tín hiệu gián đoạn, chúng ta in ra "thread bị gián đoạn..."; nếu không, chúng ta in ra "thread bình thường".

Khi bạn gọi t1.start(), t1 bắt đầu thực thi, nhưng trước khi nó hoàn thành một vòng lặp, bạn đã gọi t1.interrupt(). Điều này gây ra Thread.interrupted() trong vòng lặp của t1 trả về true, vì vậy bạn thấy "thread bị gián đoạn..." được in ra trước.

Sau đó, t2 bắt đầu thực thi, và vòng lặp của nó không nhận được tín hiệu gián đoạn nên bạn chỉ thấy "thread bình thường" được in ra.

Vì vậy, thứ tự in ra kết quả là:

  1. "thread bị gián đoạn..." (do luồng t1 nhận được tín hiệu gián đoạn trước khi hoàn thành một vòng lặp)
  2. "thread bình thường" (do vòng lặp đầu tiên của t1 đã hoàn thành và không nhận được tín hiệu gián đoạn)
  3. "thread bình thường" (do t2 không nhận được tín hiệu gián đoạn)
  4. "thread bình thường" (do t2 không nhận được tín hiệu gián đoạn)

Hy vọng điều này giải thích được!

Không có nhận xét nào:

Đăng nhận xét

code 2

  package ll; public class CalculatorModel { public double calculate ( String expression ) { return evaluateExpression (...