Tôi đẩy tương lai của tôi từ một ExecutorService vào một bản đồ băm. Sau đó, tôi có thể gọi hủy trên Futures từ bên trong bản đồ băm. Mặc dù kết quả là đúng, sau đó tôi nhấn breakpoint trong thủ tục Callable, như thể hủy Future() không có hiệu lực. . Tôi nghĩ rằng nó có thể là một trường hợp của hai tài liệu tham khảo khác nhau ở đây (mặc dù các ID tài liệu tham khảo được liệt kê như là tương tự khi breakpointing), nhưng đã tự hỏi nếu một số chuyên gia có thể kêu vang trong Đây là những gì mã trông giống như:Nhiệm vụ tương lai của ExecutorService không thực sự hủy bỏ
ExecutorService taskExecutor = Executors.newCachedThreadPool();
Map <String, Future<Object>> results = new HashMap <String, Future<Object>>();
Future<Object> future = taskExecutor.submit(new MyProcessor(uid));
results.put(uid, future);
tôi cho phép xử lý để tiếp tục (đó là một vòng lặp mà nộp nhiệm vụ khi chúng được thông qua năm), và sau đó tôi có thể cố gắng để hủy bỏ từ một nguồn bên ngoài bằng cách gọi phương pháp này:
public static synchronized boolean cancelThread(String uid) {
Future<Object> future = results.get(uid);
boolean success = false;
if (future != null) {
success = (future.isDone() ? true : future.cancel(true));
if (success)
results.remove(uid);
}
return success;
}
Nhưng tôi vẫn gặp một "phi -cố "đường dẫn trong MyProcessor.call() sau khi hàm tương lai.cancel() được gọi - nghĩa là nó không thực sự bị hủy bỏ.
Tôi sẽ làm gì sai với điều này? Có cách nào tốt hơn để làm điều này?
Cũng liên quan đến: http://stackoverflow.com/questions/6698977/thread-interrupt-will-it-cancel-oncoming-wait-call – Gray
Tôi hiểu, điều đó có nghĩa - tôi không phải chờ đợi () trạng thái tại thời điểm này trong lần gọi thứ hai, vì vậy nó không ném InterruptedException cho tôi. Thật không may, những gì tôi đang cố gắng để hủy bỏ là một cuộc gọi tuyên bố duy nhất đến một cơ sở dữ liệu một khi nó đã bắt đầu, vì vậy tốt nhất tôi có thể đặt một thử nghiệm cho nếu thread bị gián đoạn sau đó. –
Để làm rõ, đây là tuyên bố tôi có khả năng trong khi yêu cầu hủy bỏ, một PreparedStatement vào cơ sở dữ liệu: 'stmt.execute();' Vì vậy, tôi đoán tôi phải để cho khóa học kết thúc cơ sở dữ liệu, và kiểm tra gián đoạn sau đó. –