文档章节

Java并发编程高级篇(八):在执行器中取消任务

阿拉德大陆的魔法师
 阿拉德大陆的魔法师
发布于 2017/03/02 09:37
字数 500
阅读 30
收藏 0

前面我们已经学习如何把任务发送给执行器去执行,但是当我们想要取消一个已经发送给执行器的任务该怎么办呢。可以使用Future对象的cancel()方法。

首先我们创建一个任务线程类,实现Callable接口(当然你使用Runnable接口是一样的)。任务一直循环打印"This is running.",并每次休眠100ms来模拟任务执行过程。

import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;

/**
 * Created by hadoop on 2016/11/3.
 */
public class Task implements Callable<String> {
    @Override
    public String call() throws Exception {
        while (true) {
            System.out.println("Task is running.");
            TimeUnit.MILLISECONDS.sleep(100);
        }
    }
}

接下来创建主线程类。在这里我们使用Executors.newCachedThreadPool()来创建线程执行器。提交任务后休眠1s,并结束任务。

  • Future.cancel(boolean mayInterruptIfRunning):true意味着已经开始执行的任务可以被中断,false则已经运行的任务会一直运行完毕,而不会被终止。
  • Future.isCancelled():返回任务是否被成功取消。
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * Created by hadoop on 2016/11/3.
 *
 * 想取消执行其中的任务,需要调用Future接口的cancel(boolean)方法。
 *
 * 1. 如果任务已经被取消,或者因为某种原因不能被取消,那么这个方法返回false,并且任务取消失败。
 * 2. 如如任务还没有开始执行那么任务会被直接取消。
 * 3. 传递true参数,任务无论是否开始执行都将被取消。传递false参数,如果任务已经开始执行那么无法取消。
 *
 */
public class Main {
    public static void main(String[] args) throws InterruptedException {
        ThreadPoolExecutor executor = (ThreadPoolExecutor)Executors.newCachedThreadPool();

        Task task = new Task();

        Future<String> future = executor.submit(task);

        TimeUnit.SECONDS.sleep(1);

        future.cancel(true);

        System.out.printf("Cancel status: %s\n", future.isCancelled());
        System.out.printf("Done status: %s\n", future.isDone());

        executor.shutdown();
    }
}

执行结果中,你会看到提交到执行器的任务已经被终止了。

Task is running.
Task is running.
Task is running.
Task is running.
Task is running.
Task is running.
Task is running.
Task is running.
Task is running.
Task is running.
Cancel status: true
Done status: true

© 著作权归作者所有

阿拉德大陆的魔法师
粉丝 27
博文 91
码字总数 83019
作品 0
西城
程序员
私信 提问
Java多线程(全)学习笔记(下)

七.Callable和Future接口 C#可以把任意方法包装成线程执行体,包括那些有返回值的方法。Java也从jdk1.5开始,加入了Callable接口用来扩展Runnable接口的功能,Callable接口提供一个call()...

明舞
2014/07/27
206
0
Java多线程学习(八)线程池与Executor 框架

Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/JavaGuide 历史优质文章推荐: Java并发编程指南专栏 分布式系统的经典基础理...

snailclimb
2018/05/31
0
0
Java线程面试题 Top 50

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者...

loda0128
2015/05/29
964
1
java并发编程(六): 取消与关闭

取消与关闭: 如何正确,安全地取消或关闭任务。 任务取消: 若外部代码能在某个操作正常完成之前将其置入“完成”状态,则还操作是可取消的。 取消操作的原因: 1. 用户请求取消。 2. 有时间...

ihaolin
2014/03/30
1K
0
JAVA多线程和并发基础面试问答

多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题。(校对注:...

LCZ777
2014/05/26
189
0

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins World 贡献者峰会及专家答疑展位

本文首发于:Jenkins 中文社区 原文链接 作者:Marky Jackson 译者:shunw Jenkins World 贡献者峰会及专家答疑展位 本文为 Jenkins World 贡献者峰会活动期间的记录 Jenkins 15周岁啦!Jen...

Jenkins中文社区
22分钟前
6
0
杂谈:面向微服务的体系结构评审中需要问的三个问题

面向微服务的体系结构如今风靡全球。这是因为更快的部署节奏和更低的成本是面向微服务的体系结构的基本承诺。 然而,对于大多数试水的公司来说,开发活动更多的是将现有的单块应用程序转换为...

liululee
37分钟前
6
0
OSChina 周二乱弹 —— 我等饭呢,你是不是来错食堂了?

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ 自行车丢了:给主编推荐首歌 《クリスマスの夜》- 岡村孝子 手机党少年们想听歌,请使劲儿戳(这里) @烽火燎原 :国庆快来,我需要长假! ...

小小编辑
今天
409
9
玩转 Springboot 2 之热部署(DevTools)

Devtools 介绍 SpringBoot 提供了热部署的功能,那啥是热部署累?SpringBoot官方是这样说的:只要类路径上的文件发生更改,就会自动重新启动应用程序。在IDE中工作时,这可能是一个有用的功能...

桌前明月
今天
5
0
CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部