java - 如何停止java执行程序类中的所有可运行线程?

Posted

技术标签:

【中文标题】java - 如何停止java执行程序类中的所有可运行线程?【英文标题】:How to stop all runnable thread in java executor class? 【发布时间】:2013-03-31 18:59:42 【问题描述】:
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 类应终止线程。

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

【问题讨论】:

Java: Force stopping of ExecutorService threads 的可能重复项 【参考方案1】:

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();

【讨论】:

请查看有问题的运行方法。我试过但抛出异常 见我上面的编辑。此代码示例将等待十秒钟,然后强制关闭。 @Ducan 正是我用上面的代码尝试过,但它抛出了我在我的问题中写的异常 由于您在示例代码中选择了使用阻塞方法 (sleep()),因此引发了异常。这是正确的预期行为。 正确!在 Runnable 类中检查 if (Thread.interrupted()) 很重要,否则线程会继续运行【参考方案2】:

从外部终止正在运行的线程通常是个坏主意,因为您不知道线程当前所处的状态。它可能需要进行一些清理,而它无法当你强行关闭它时这样做。 That's why all methods of Thread which do that are marked as deprecated.

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

【讨论】:

我正要说这个。这就是 Thread.stop() 被贬低的原因:docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#stop() ExecutorService 的特定情况下,我会投票支持线程中断而不是标志。在许多框架中,服务会以shutdownNow() 终止。

以上是关于java - 如何停止java执行程序类中的所有可运行线程?的主要内容,如果未能解决你的问题,请参考以下文章

java中TimerTask 如何才能停止呢

一个Java程序的执行过程(转)

如何在 Java 类中找到使用特定方法的所有执行路径?

Java 虚拟机原理Java 类中的类加载初始化细节 ( 只使用类中的常量时加载类不会执行到 ‘初始化‘ 阶段 )

Java中的超时数据库连接

使用java语言,如何对一个类中的静态方法做切面编程?