Không thể chấm dứt chuỗi trừ khi mã đang chạy trong chuỗi đó kiểm tra và cho phép chấm dứt.
Bạn nói: "Đáng buồn là tôi phải giết/khởi động lại nó ... Tôi không hoàn toàn kiểm soát các nội dung của chủ đề và hoàn cảnh của ta nó đòi hỏi khởi động lại"
Nếu các nội dung của chủ đề không cho phép chấm dứt hoạt động của nó thì bạn không thể chấm dứt chuỗi đó.
Trong bài của bạn, bạn nói: "Nỗ lực đầu tiên của tôi là với ExecutorService nhưng tôi dường như không thể tìm thấy một cách để nó khởi động lại một nhiệm vụ Khi tôi sử dụng .shutdownnow() ...."
Nếu bạn nhìn vào nguồn của "shutdownnow" nó chỉ chạy qua và ngắt các luồng đang chạy.Điều này sẽ không dừng việc thực thi của chúng, trừ khi mã trong các luồng đó kiểm tra xem nó có bị vô hiệu hóa hay không, và nếu vậy, hãy ngừng thực thi chính nó. Vì vậy, shutdownnow có lẽ không làm những gì bạn nghĩ.
Hãy để tôi minh họa cho những gì tôi có nghĩa là khi tôi nói rằng các nội dung của chủ đề phải cho phép cho chủ đề đó để được chấm dứt:
myExecutor.execute(new Runnable() {
public void run() {
while (true) {
System.out.println("running");
}
}
});
myExecutor.shutdownnow();
chủ đề đó sẽ tiếp tục chạy mãi mãi, mặc dù shutdownnow được gọi, bởi vì nó không bao giờ kiểm tra xem nó có bị chấm dứt hay không. chủ đề này, tuy nhiên, sẽ đóng cửa:
myExecutor.execute(new Runnable() {
public void run() {
while (!Thread.interrupted()) {
System.out.println("running");
}
}
});
myExecutor.shutdownnow();
Kể từ chủ đề này kiểm tra xem có hay không nó đã bị gián đoạn/tắt/chấm dứt.
Vì vậy, nếu bạn muốn một chủ đề mà bạn có thể tắt, bạn cần phải chắc chắn rằng nó kiểm tra xem nó đã bị gián đoạn hay chưa. Nếu bạn muốn một chủ đề mà bạn có thể "tắt" và "khởi động lại", bạn có thể thực hiện một runnable có thể thực hiện các nhiệm vụ mới như đã được đề cập trước đó.
Tại sao bạn không thể tắt một chuỗi đang chạy? Vâng tôi thực sự nói dối, bạn có thể gọi "yourThread.stop()" nhưng tại sao đây là một ý tưởng tồi? Các chủ đề có thể được trong một đồng bộ (hoặc phần quan trọng khác, nhưng chúng tôi sẽ giới hạn mình để thiết lập bảo vệ bởi từ khóa syncrhonized ở đây) phần mã khi bạn dừng nó. khối synch được cho là được thực hiện trong toàn bộ của họ và chỉ bởi một sợi trước khi được truy cập bởi một số chủ đề khác. Nếu bạn dừng một luồng ở giữa khối đồng bộ, sự bảo vệ được đưa vào vị trí bởi khối đồng bộ sẽ bị vô hiệu và chương trình của bạn sẽ đi vào trạng thái không xác định. Các nhà phát triển tạo các công cụ trong khối đồng bộ để giữ mọi thứ đồng bộ, nếu bạn sử dụng threadInstance.stop() bạn phá hủy ý nghĩa đồng bộ hóa, những gì nhà phát triển của mã đó đang cố hoàn thành và cách nhà phát triển của mã đó mong đợi các khối được đồng bộ hóa của mình hành xử.
Đối với câu hỏi này bạn cũng có thể tham khảo: http://stackoverflow.com/questions/22937592/resume-interrupted-thread – artiethenoble