并发编程:执行器:7、取消任务(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;
		*/
        /*
		//第三种写法??
		while(!Thread.currentThread().isInterrupted()) {
			System.out.println("执行中");
		}
		System.out.println(Thread.currentThread().getName()+":线程被中断啦");
		return null;
		*/
	}

}

三、执行结果

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

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
并发执行和并行执行是计算机领域中常用的两个概念,它们都指的是多个任务同时执行的情况,但是具体的实现方式和效果略有不同。 并发执行指的是多个任务在同一时间段内交替执行的过程。在单处理器系统中,每个任务都只能在一个时间片内执行一部分,然后被挂起,等待下一个时间片再次执行。由于时间片极短,任务的执行看起来是同时进行的,因此被称为并发执行。并发执行可以提高系统的吞吐量和响应速度,但是由于任务之间需要频繁地切换,会增加系统的开销和复杂度。 并行执行指的是多个任务在多个处理器上同时执行的过程。在多处理器系统中,每个任务可以分配到不同的处理器上执行,从而实现真正的并行执行。由于任务在不同的处理器上执行,彼此之间互不干扰,因此可以大大提高系统的计算能力和吞吐量。但是并行执行需要满足任务之间可以并行执行的条件,如任务之间的依赖关系、数据共享等,否则可能会出现竞争和冲突,导致执行结果不正确。 综上所述,并发执行和并行执行都是多任务执行的方式,但是并发执行是在单处理器上通过时间片轮转等技术实现的,而并行执行是在多处理器上通过任务分配和并行执行实现的。两者都有其适用的场景和优缺点,需要根据具体的应用需求和硬件条件进行选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值