Tôi muốn quản lý một danh sách các đối tượng tương lai được trả về bởi TaskExecutor của tôi.
Tôi đã một cái gì đó như thế nàyJava Thread - hành vi lạ Thread.interrupted() và tương lai.cancel (true)
List<Future<String>> list
void process(ProcessThis processThis) {
for (...) {
Future<String> future = taskExecutor.submit(processThis);
list.add(future)
}
}
void removeFutures() {
for(Future future : list) {
assert future.cancel(true);
}
ProcessThis là một nhiệm vụ mà thực hiện Callable < String> và kiểm tra Thread.interrupted() tình trạng
public String call() {
while (true) {
if (Thread.interrupted()) {
break;
}
doSomething();
}
}
Bây giờ vấn đề là chỉ là một tập hợp con của các Threads đồng thời trả về 'true' khi Thread.interrupted() được gọi.
Xác nhận trong removeFutures() trả về giá trị true cho mỗi tương lai bị xóa (tôi đã chọn isDone() và isCompleted() là
Số lượng Chủ đề bị gián đoạn là ngẫu nhiên. đôi khi 2 ...
Tôi thực sự không hiểu vấn đề ở đâu. Nếu tôi gọi future.cancel (true) và điều này trả về true ... và sau đó tôi kiểm tra Thread.interrupted (điều này được gọi chỉ một lần), tôi mong đợi này để trả lại sự thật là tốt.
Bất kỳ ý tưởng về những gì tôi bị mất?
tôi đang trên build java 1.6.0_02-b05
cảm ơn phản hồi của bạn. điểm của việc này là gì? Nếu Thread.interrupted() trả về true, tôi sẽ phá vỡ chu kỳ while và về cơ bản tôi sẽ hủy thread. Vấn đề là đôi khi Thread.interrupted() trả về 'false' ngay cả khi tương lai liên quan.cancel (true) trả về true. Dòng bạn đã chỉnh sửa thậm chí không thể đạt được tại thời điểm đó. – marts
Sau đó cờ gián đoạn có thể bị mất ở đâu đó trong 'doSomething()' (vì lý do tương tự - một cái gì đó đặt lại cờ và không khôi phục lại). Đó là, mẫu trong câu trả lời của tôi là một nguyên tắc cơ bản mà nên được sử dụng để tránh bị mất ngắt – axtavt
Nếu đó là trường hợp ('tránh bị gián đoạn bị ngắt') tôi không thể sử dụng một cái gì đó như Thread.currentThread(). IsInterrupted() thay vì phải khôi phục trạng thái ngắt mỗi khi tôi sử dụng Thread.interrupted(). (BTW có một lỗi với điều này: http://stackoverflow.com/questions/2012259/) Tôi không phải đối phó với tình trạng gián đoạn trong doSomething. – marts