"Chào, Amigo!
"Mọi thứ mới chỉ là một cái gì đó cũ mà chúng ta đã quên. Hôm nay tôi sẽ nói về việc dừng các luồng. Tôi hy vọng bạn đã quên cách thức hoạt động của phương thức ngắt()."
"Vâng, Ellie, tôi đã hoàn toàn quên nó."
"Tuyệt. Vậy tôi sẽ nhắc cậu."
"Trong Java, nếu ai đó muốn dừng một luồng đang chạy, anh ta có thể báo hiệu điều này cho luồng đó. Để làm điều này, bạn cần đặt biến isInterrupted ẩn của đối tượng Thread thành true."
"Mỗi Chủ đề có một phương thức ngắt (), được sử dụng để đặt cờ này. Khi phương thức ngắt () được gọi, biến isInterrupted bên trong đối tượng Chủ đề được đặt thành đúng."
"Và khi phương thức Thread.sleep() hoặc join() được gọi trên một luồng, phương thức này sẽ kiểm tra xem cờ isInterrupted có được đặt cho luồng hiện tại hay không. Nếu cờ này được đặt (biến isInterrupted bằng true), thì các phương thức ném một ngoại lệ gián đoạn ."
"Ở đây, tôi sẽ nhắc bạn về một ví dụ cũ:"
Mã số | Sự miêu tả |
---|---|
|
Phương thức chạy của Clock lấy đối tượng Thread cho luồng hiện tại.
Lớp Đồng hồ ghi từ "Tick" vào bảng điều khiển một lần mỗi giây miễn là biến isInterrupt của luồng hiện tại là sai. Khi isInterrupt trở thành true, phương thức chạy sẽ kết thúc. |
|
Chuỗi chính bắt đầu một chuỗi con (đồng hồ) sẽ chạy mãi mãi.
Đợi 10 giây và hủy tác vụ bằng cách gọi phương thức ngắt. Chủ đề chính hoàn thành công việc của nó. Kim đồng hồ kết thúc công việc của nó. |
"Ở đây chúng tôi sử dụng phương thức ngủ như một phần của vòng lặp vô hạn trong phương thức chạy . Trong vòng lặp, biến isInterrupt được kiểm tra tự động. Nếu một luồng gọi phương thức ngủ , trước tiên, phương thức này sẽ kiểm tra xem isInterrupt có đúng với luồng đó không (các một phương thức được gọi là phương thức ngủ). Nếu đúng, thì phương thức đó sẽ không ngủ. Thay vào đó, nó ném ra một Ngoại lệ gián đoạn ."
"Nhưng trong ví dụ này, chúng tôi liên tục kiểm tra biến isInterrupted trong điều kiện của vòng lặp."
"Tôi nhớ có một số lý do tại sao chúng ta không thể sử dụng phương pháp này. Bạn có thể nhắc tôi được không?"
" Đầu tiên , phương thức chạy không phải lúc nào cũng có vòng lặp. Phương thức này có thể chỉ bao gồm vài chục lệnh gọi đến các phương thức khác. Trong trường hợp này, bạn sẽ phải thêm kiểm tra isInterrupted trước mỗi lệnh gọi phương thức."
" Thứ hai , một số phương pháp liên quan đến nhiều hành động khác nhau có thể mất nhiều thời gian để thực thi."
" Thứ ba , việc ném một ngoại lệ không thay thế kiểm tra isInterrupted. Nó chỉ là một bổ sung thuận tiện. Ngoại lệ được ném cho phép bạn nhanh chóng hủy ngăn xếp cuộc gọi trở lại chính phương thức chạy. "
" Thứ tư , phương pháp ngủ được sử dụng rất nhiều. Hóa ra phương pháp hữu ích này được tăng cường bởi một kiểm tra ngầm không kém phần hữu ích. Có vẻ như không ai cụ thể thêm kiểm tra, nhưng nó ở đó. Điều này cực kỳ có giá trị khi bạn đang sử dụng mã của người khác và bạn không thể tự thêm kiểm tra."
" Thứ năm , kiểm tra bổ sung không làm giảm hiệu suất. Gọi phương thức ngủ có nghĩa là luồng không nên làm bất cứ điều gì (ngoại trừ ngủ), vì vậy công việc bổ sung không làm phiền bất kỳ ai."
"Đó chính xác là những gì bạn đã nói trước đây."
"Còn câu nói của bạn thì sao, « Không ai có thể đảm bảo rằng một sợi chỉ sẽ dừng lại. Chỉ một sợi dây mới có thể tự dừng lại. » Bạn có thể giải thích điều đó không?"
"Chắc chắn."
"Trước đây, trong các phiên bản đầu tiên của Java, các luồng có một phương thức stop(). Và khi bạn gọi nó, JVM thực sự đã dừng luồng đó. Nhưng nếu một luồng đang thực hiện điều gì đó bên ngoài JVM (ví dụ: ghi vào một tệp hoặc gọi OS) khi nó bị gián đoạn theo cách này, sự gián đoạn gây ra rất nhiều vấn đề, chẳng hạn như các tệp không được đóng, tài nguyên hệ thống không được giải phóng, v.v."
"Một cuộc họp chung của những người sáng tạo Java đã quyết định loại bỏ phương thức buộc dừng luồng. Bây giờ, tất cả những gì chúng ta có thể làm là đặt một cờ nhất định (isInterrupted) và hy vọng rằng mã luồng được viết chính xác, để cờ này sẽ được xử lý. Cờ này nó giống như một tấm biển nói rằng, 'Sợi dây, dừng lại, làm ơn. Nó rất quan trọng!'. Nhưng nó có dừng lại hay không là việc của chính nó."
"Nhưng còn InterruptedException thì sao?"
"Điều gì sẽ xảy ra nếu mã chạy trên chuỗi này có một loạt các khối thử bắt? Ngay cả khi một Ngoại lệ gián đoạn xảy ra ở đâu đó, chắc chắn không có gì đảm bảo rằng một số thử bắt sẽ không bắt được và quên nó đi. Vì vậy, không có gì đảm bảo rằng chủ đề sẽ dừng lại."
"Một điều nữa là các luồng đã được coi là lập trình cấp thấp. Nhưng tôi sẽ nói với bạn về điều đó vào lần tới."
"Bạn không phải là Ellie - bạn là Scheherazade!"
"Vậy, Amigo! Mọi thứ trong bài học hiện tại đã rõ ràng chưa?"
"Chuẩn rồi."
"Được, tốt."
GO TO FULL VERSION