Tác vụ đã lên lịch đang được thực hiện hoặc đang chờ thực hiện.
Nếu tác vụ đang đợi để được thực hiện, future.cancel()
sẽ ngăn không cho nó được thực hiện (cả hủy (đúng)/hủy (sai)).
Nếu tác vụ đã được thực hiện, future.cancel(false)
sẽ không có hiệu lực. future.cancel(true)
sẽ làm gián đoạn chuỗi đang thực hiện tác vụ đó. Việc này có ảnh hưởng đến bạn hay không, ai sẽ thực hiện nhiệm vụ đó. Tác vụ có thể hoặc không thể phản hồi gián đoạn tùy thuộc vào việc triển khai.
Để làm cho tác vụ của bạn đáp ứng yêu cầu hủy, bạn phải triển khai doSomething()
để nó sẽ phản hồi sự gián đoạn.
Về cơ bản có hai cách để làm điều này:
1.Check gián đoạn cờ trong logic của bạn
public void doSomething(){
stuff();
//Don't use Thread.interrupt()
if(Thread.currentThread().isInterrupted()){
// We have an interruption request, possibly a cancel request
//Stop doing what you are doing and terminate.
return;
}
doLongRunningStuff();
}
Bạn thỉnh thoảng phải kiểm tra cờ gián đoạn, và nếu bị gián đoạn, dừng lại những gì bạn đang làm và quay lại. Hãy chắc chắn sử dụng Thread.isInterrupted() và không Thread.interrupt() cho kiểm tra.
2.Act khi ngoại lệ Interrupted
public void doSomething(){
try{
stuff();
}catch(InterruptedException e){
// We have an interruption request, possibly a cancel request
// First, preserve Interrupted Status because InterruptedException clears the
// interrupted flag
Thread.currentThread.interrupt();
// Now stop doing your task and terminate
return;
}
doLongRunningStuff();
}
Khi bạn có bất kỳ phương pháp mà ném InterruptedException, hãy chắc chắn để ngăn chặn những gì bạn làm và chấm dứt khi một được ném.
Khi bạn thực hiện các phương pháp theo cách này, bạn có thể gọi future.cancel (true) để hủy việc thực thi tác vụ đang chạy.
Điều gì đang xảy ra trong doSomething()? –