Trên Android, các quy tắc tương tự áp dụng như trong môi trường Java bình thường. Trong các chủ đề Java không bị giết, nhưng việc dừng một sợi chỉ được thực hiện theo cách hợp tác . Chủ đề được yêu cầu chấm dứt và sau đó luồng có thể tắt một cách duyên dáng.
Thường thì trường volatile boolean
được sử dụng mà chuỗi định kỳ kiểm tra và chấm dứt khi được đặt thành giá trị tương ứng.
tôi sẽ không sử dụng một boolean
để kiểm tra xem thread nên chấm dứt. Nếu bạn sử dụng volatile
làm công cụ sửa đổi trường, điều này sẽ hoạt động đáng tin cậy, nhưng nếu mã của bạn trở nên phức tạp hơn, thay vào đó sử dụng các phương pháp chặn khác trong vòng while
, có thể xảy ra, mã của bạn sẽ không chấm dứt ở tất cả hoặc ít nhất mất nhiều thời gian hơn như bạn có thể muốn.
Một số phương pháp thư viện chặn nhất định hỗ trợ gián đoạn.
Mọi chủ đề đã có cờ boolean trạng thái bị gián đoạn và bạn nên tận dụng nó. Nó có thể được thực hiện như thế này:
public void run() {
try {
while(!Thread.currentThread().isInterrupted()) {
// ...
}
} catch (InterruptedException consumed)
/* Allow thread to exit */
}
}
public void cancel() { interrupt(); }
Mã nguồn lấy từ Java Concurrency in Practice. Vì phương thức cancel()
là công khai, bạn có thể cho phép một luồng khác gọi phương thức này như bạn muốn.
Ngoài ra còn có phương thức tĩnh được đặt tên kém interrupted
để xóa trạng thái bị gián đoạn của chuỗi hiện tại.
Nguồn
2014-05-20 10:54:25
AsyncTask không thực sự là một thay thế cho cơ chế gián đoạn, nó còn là công cụ tương tác với giao diện người dùng. Như tôi đã chỉ ra trong câu trả lời của tôi, bạn sẽ vẫn phải triển khai cùng một cơ chế trong AsyncTask như trong bất kỳ luồng chung nào, nếu bạn muốn có thể dừng nó trong khi thực thi. – Malcolm