16
final ExecutorService executor = Executors.newFixedThreadPool(1);
final Future<?> future = executor.submit(myRunnable);
executor.shutdown();
if(executor.awaitTermination(10, TimeUnit.SECONDS)) {
  System.out.println("task completed");
}else{
  System.out.println("Executor is shutdown now");
}

//MyRunnable method is defined as task which I want to execute in a different thread.

这是run执行程序类的方法:

public void run() {
try {
     Thread.sleep(20 * 1000);
} catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
}}

在这里它正在等待20第二次,但是当我运行代码时它会引发异常:

java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)

我无法关闭破坏Java Executor class. 这是我的代码流程:

  • 使用 Java 执行器类创建了一个新线程来运行一些任务,即用MyRunnable
  • executor等待 10 秒完成任务。
  • 如果任务已经完成,那么可运行线程也被终止。
  • 如果任务未在 10 秒内完成,则executor类应终止线程。

除了在最后一个场景中终止任务外,一切正常。我该怎么做?

4

2 回答 2

25

shutDown()方法只是防止安排额外的任务。相反,您可以调用shutDownNow()并检查Runnable.

// in your Runnable...
if (Thread.interrupted()) {
  // Executor has probably asked us to stop
}

根据您的代码,一个示例可能是:

final ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(new Runnable() {
  public void run() {
    try {
      Thread.sleep(20 * 1000);
    } catch (InterruptedException e) {
      System.out.println("Interrupted, so exiting.");
    }
  }
});

if (executor.awaitTermination(10, TimeUnit.SECONDS)) {
  System.out.println("task completed");
} else {
  System.out.println("Forcing shutdown...");
  executor.shutdownNow();
}
于 2013-04-09T11:21:28.723 回答
8

从外部终止正在运行的线程通常是一个坏主意,因为您不知道线程当前所处的状态。它可能需要进行一些清理,而当你强行关闭它。这就是为什么所有执行此操作的 Thread 方法都标记为 deprecated

最好使用可用于进程间通信的众多技术中的一种来向线程本身中运行的过程发出信号,表明它必须中止其工作并正常退出。一种方法是abort()向您的可运行文件添加一个方法,该方法会引发一个声明为volatile. Runnable 的内部循环检查该标志并在该标志被提升时退出(以受控方式)。

于 2013-04-09T11:24:09.887 回答