并发编程:执行器:7、取消任务(future.cancel())

并发编程:执行器:7、取消任务(future.cancel())future.cancel()在执行器内取消任务

目录

future.cancel(true)

案例说明

一、主程序

二、无限循环的任务

三、执行结果


future.cancel(true)

当我们使用线程执行器提交任务时,只需要提供Callable或者Runnable接口任务即可,但有时候我们需要在提交之后取消它们。我们使用执行器提交任务时,返回的Future对象,调用它的cancel()方法即可。

  • 参数true:如果任务已经被执行,则会尝试中断处理。(中断处理会改变中断标志位,任务应该判断isInterrupted()或者在任务过程中使用sleep,这样任务才可以被中断)
  • 参数false:如果任务已经被执行,则会等待任务执行完毕。如果是个无线循环任务,将会无法停止。

案例说明

提交一个无限循环的任务,等待2秒后取消该任务。

一、主程序

package xyz.jangle.thread.test.n4_8.cancel;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

/**
 * 4.8、在执行器内取消任务
 * 	提交一个无限循环的任务,等待2秒后取消该任务。
 * 
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年8月23日 下午5:23:33
 * 
 */
public class M {

	public static void main(String[] args) {
		ExecutorService threadPool = Executors.newCachedThreadPool();
		Task task = new Task();
		System.out.println("Main:开始执行任务");
		Future<String> future = threadPool.submit(task);
		try {
			TimeUnit.SECONDS.sleep(2);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("Main:取消任务");
		// 参数true 如果线程正在运行则进行中断处理。
		future.cancel(true);
		System.out.println("Main:isCancelled:" + future.isCancelled());
		System.out.println("Main:isDone:" + future.isDone());
		threadPool.shutdown();
		System.out.println("Main:结束执行任务");

	}

}

二、无限循环的任务

package xyz.jangle.thread.test.n4_8.cancel;

import java.util.concurrent.Callable;

/**
 * 普通的无线循环任务
 * 
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年8月23日 下午5:25:34
 * 
 */
public class Task implements Callable<String> {

	@Override
	public String call() throws Exception {
		while(true) {
			System.out.println("执行中...");
			// 用于取消时,可被中断。(sleep遇到中断标志会抛出InterruptedException异常。从而结束方法)
			Thread.sleep(100);
		}
		/*
		//第二种写法
		while (!Thread.currentThread().isInterrupted()) {
			System.out.println("执行中...");
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
				//InterruptedException会清除中断状态,在此处进行再次中断处理即可。
				Thread.currentThread().interrupt();
			}
		}
		System.out.println(Thread.currentThread().getName()+":线程被中断啦");
		return null;
		*/
	}

}

三、执行结果

Main:开始执行任务
执行中...
执行中...
执行中...
执行中...
执行中...
执行中...
执行中...
执行中...
执行中...
执行中...
执行中...
执行中...
执行中...
执行中...
执行中...
执行中...
执行中...
执行中...
执行中...
执行中...
Main:取消任务
Main:isCancelled:true
Main:isDone:true
Main:结束执行任务

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38432.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注