ExecutorService 之 取消执行程序中的任务

使用允许您进行取消操作的对象方法,学习取消提交给执行者的任务,该任务仍必须执行且尚未完成。cancel()Future

1.未来的cancel()API

所述Future.cancel(mayInterruptIfRunning)方法采用类型的一个参数boolean

boolean cancel(boolean mayInterruptIfRunning);

根据mayInterruptIfRunning提交给执行者的任务的值和状态,此方法的行为不同:

  • 如果任务已完成或已提前取消,或者由于其他原因无法取消,则该方法将返回该false值,并且该任务也不会被取消。
  • 如果任务在执行程序中等待开始执行,则该任务将被取消并且将永远不会开始执行。方法将返回true
  • 如果任务已经在运行并且mayInterruptIfRunning参数值为true,则任务将被取消。
  • 如果任务已经在运行并且mayInterruptIfRunning参数值为false,则不会取消任务。

2.任务取消示例

在此Java程序中,我们将在计划的时间一分钟后执行任务。计划后,我们使用isDone()方法检查任务的状态,方法返回false尚未完成的任务。

然后,我们取消任务,并使用isCancelled()isDone()方法检查任务的状态。

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

public class Main 
{
	public static void main(String[] args) throws InterruptedException, ExecutionException 
	{
		ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
		
		LocalDateTime now = LocalDateTime.now();
	        LocalDateTime afterOneMinute = now.plusMinutes(1);
	 
	        Duration duration = Duration.between(now, afterOneMinute);
	        long delay = Math.abs(duration.toMillis());
	    
	        System.out.println("Task scheduled at : "+ LocalDateTime.now());
		
	        ScheduledFuture<String> result = executor.schedule(new Task("Task-1"), delay, TimeUnit.MILLISECONDS);
		
		System.out.println("Task is done : " + result.isDone());
		
		if(result.isDone() == false) 
		{
			System.out.println("====Cancelling the task====");

			result.cancel(false);
		}
		
		System.out.println("Task is cancelled : " + result.isCancelled());
		
		System.out.println("Task is done : " + result.isDone());
		
		executor.shutdown();
	}
}

class Task implements Callable<String> 
{
	private final String name;

	public Task(String name) {
		this.name = name;
	}

	@Override
	public String call() throws Exception {
		System.out.println("Task [" + name + "] executed on : " + LocalDateTime.now().toString());
		return "Task [" + name + "] is SUCCESS !!";
	}
}

程序输出。

Task scheduled at : 2019-05-23T16:23:52.001

Task is done : false

====Cancelling the task====

Task is cancelled : true

Task is done : true

显然,取消任务后,任务的完成状态也为true

在关于如何取消 Java中提交给执行者的任务的注解中,我提问。

saigon has written 1445 articles

Leave a Reply