目录
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