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

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-31 07:36   41   0

目录

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:结束执行任务

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP