Future.cancel()方法是不工作(Future.cancel() method is no

2019-07-04 06:06发布

我有代码创建一个Callable实例,正在创建使用ExecutorService的一个新的线程。 我想一定的时间后,来杀死这个线程,如果线程没有它的执行完成。 通过JDK文档会后,我已经意识到,Future.cancel()方法可以用来停止线程的执行,但令我非常沮丧它不工作。 当然的Future.get()方法发送中断在规定的时间后线程(在我的情况下,其2秒),甚至线程接收到此中断,但这种中断可能发生一次的线程与它的执行完成完全。 但我想2秒后杀死线程。

谁能帮助我如何实现这一目标。

TestClass的代码:

====================================

public class TestExecService {

      public static void main(String[] args) {

          //checkFixedThreadPool();
          checkCallablePool();

          }

      private static void checkCallablePool()
      {
          PrintCallableTask task1 = new PrintCallableTask("thread1");

          ExecutorService threadExecutor = Executors.newFixedThreadPool(1);
          Future<String> future = threadExecutor.submit(task1);

          try {
                System.out.println("Started..");
                System.out.println("Return VAL from thread ===>>>>>" + future.get(2, TimeUnit.SECONDS));
                System.out.println("Finished!");
            }
          catch (InterruptedException e) 
          {
            System.out.println("Thread got Interrupted Exception ==============================>>>>>>>>>>>>>>>>>>>>>>>>>");
            //e.printStackTrace();
          }
          catch (ExecutionException e) 
          {
            System.out.println("Thread got Execution Exception ==============================>>>>>>>>>>>>>>>>>>>>>>>>>");
          }
          catch (TimeoutException e)
          {
            System.out.println("Thread got TimedOut Exception ==============================>>>>>>>>>>>>>>>>>>>>>>>>>");
            future.cancel(true);
          }

          threadExecutor.shutdownNow();

      }
}

可调用类代码:

===================================================================
package com.test;

import java.util.concurrent.Callable;

public class PrintCallableTask implements Callable<String> {

      private int sleepTime;
      private String threadName;

    public PrintCallableTask(String name)
    {
        threadName = name;
        sleepTime = 100000;     
    }

    @Override
    public String call() throws Exception {

        try {
              System.out.printf("%s going to sleep for %d milliseconds.\n", threadName, sleepTime);
              int i = 0;

              while (i < 100000)
              {
                  System.out.println(i++);
              }


              Thread.sleep(sleepTime); // put thread to sleep
              System.out.printf("%s is in middle of execution \n", threadName);

            } catch (InterruptedException exception) {
              exception.printStackTrace();
            }


            System.out.printf("%s done sleeping\n", threadName);

            return "success";
    }

}

Answer 1:

你的代码做的一切权利。 唯一的问题是,你不检查Thread.isInterruptedwhile循环。 线程得到消息的唯一途径是去的阻塞调用Thread.sleep将立即抛出InterruptedException 。 如果循环是漫长的,可能需要一些时间。 这正是为什么你的代码是有点反应迟钝。

检查中断状态,也就是说,每1万次迭代:

while (i < 100000) {

    if (i % 10000 == 0 && Thread.currentThread().isInterrupted())
        return "fail";

    System.out.println(i++);
}

InterruptedException是漫长的阻断方法。 Thread.isInterrupted是一切。



Answer 2:

cancel()只是调用interrupt()对已经执行的线程。

http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html :

中断是一个指示线程它应该终止它在做什么和做别的事情。 它是由程序员决定一个线程究竟是如何响应中断,但它是很常见的线程终止。

中断线程会抛出InterruptedException的唯一

当一个线程正在等待,休眠,或以其它方式暂停相当长的时间,并使用在类线程中断()方法时另一个线程中断。

所以,你需要明确地使工作代码,执行线程意识到可能中断。

又见谁在调用Java线程中断()方法,如果我不? 。

又见如何取消的Java 8 completable未来? 如Java期货在Java 8只成熟。



文章来源: Future.cancel() method is not working