当前位置: 首页 > 面试题库 >

如何在Java executor类中停止所有可运行线程?

漆雕兴平
2023-03-14
问题内容
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类应终止线程。

除了在最后一个场景中终止任务以外,其他所有操作都正常。我该怎么办?


问题答案:

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


 类似资料:
  • 我需要做的是能够停止从一个实现runnable的线程类运行的所有线程。这就是我的意思:这里是我的“线程”类的开始: 这就是我如何创建多个线程来执行此操作: m是要创建的线程数。这可能是从50到1000的任何地方。现在我需要做的是突然立刻停止所有的动作。我该怎么做呢?

  • 我的代码中有一个中断点,用来挂起所有的线程,但是为了测试一个bug,我想同时在该断点运行所有停止的线程,但是我无法找到它。我只能1乘1恢复线程,这对我的测试来说太慢了,有什么帮助吗?

  • 问题内容: 我有一个多线程的Java项目,我想添加一个方法stop()来停止所有正在运行的线程。问题在于该项目是由其他人开发的,而我不熟悉它如何实现多个线程。 我知道的是,一旦项目开始,就会调用许多线程,并且它们将永远运行。有没有办法找到所有正在运行的线程并停止它们?我进行了很多搜索,找到了如何获取正在运行的线程的列表: 接下来要停止所有正在运行的线程该怎么办? 我想停止这些线程的原因是,我需要将

  • 我之所以要停止这些线程,是因为我需要将这个项目作为一个捆绑包部署到OSGi容器中。一旦包启动,多个线程将永远运行。因此,我需要实现一个destroy()方法来停止所有线程,以控制包的生命周期。 怎么样

  • 问题内容: 我已经用GUI制作了一个Java程序,并且想要一个停止按钮功能,其中当用户单击停止按钮时,必须停止该程序。 在我的程序中,主线程启动其他10个线程,我希望每当单击“停止”按钮时,所有10个线程都必须在主线程之前停止。 其次,我还希望每当停止这10个线程中的任何一个线程时,它都必须先关闭它打开的所有资源,然后再连接数据库等。 我已经实现了.......回答的代码。 现在有一个问题。 我的

  • 问题内容: 我在停止“供稿”时遇到问题;cancel参数似乎对after方法没有任何影响。尽管“进纸停止”已打印到控制台。 我尝试使用一个按钮将启动供稿,而另一个按钮将停止供稿。 随着输出: 问题答案: 问题是,即使你打电话与停止循环,已经有等待消防挂起的工作。按下停止按钮不会触发新的作业,但是旧的作业仍然存在,并且当它自己调用时,它将传入False,这将导致循环继续。 您需要取消待处理的作业,以