当前位置: 首页 > 知识库问答 >
问题:

我的程序不会以Executor返回/结束

经正祥
2023-03-14

给定以下使用多线程的Java示例:

 import java.util.concurrent.*;

 public class SquareCalculator {
     private ExecutorService executor = Executors.newSingleThreadExecutor();

     public Future<Integer> calculate(Integer input) {
         return executor.submit( () -> {
             Thread.sleep(1000);
             return input * input;
         });
     }

     public static void main(String[] args) {
         try {
             Future<Integer> future = new SquareCalculator().calculate(10);
             while (!future.isDone()){
                 System.out.println("Calculating...");
                 Thread.sleep(300);
             }

             Integer result = future.get();
             System.out.println("we got: " + result);
         } catch(InterruptedException | ExecutionException e) {
             System.out.println("had exception");
         }
     }
 }

它产生:

java SquareCalculator
Calculating...
Calculating...
Calculating...
Calculating...
we got: 100

但应用程序永远不会终止。

我是不是该加入这条线什么的?

共有3个答案

令狐晟
2023-03-14

您需要在程序快结束时关闭executor framework,并等待它正常终止。。

executor.shutdown();
try {
    executor.awaitTermination(4 * 3600, TimeUnit.SECONDS);
} catch (Exception e) {
    e.printStackTrace();
}
陶飞英
2023-03-14

我打赌你想添加这样的内容:

   finally {
        if (executor != null) {
            executor.shutdown();
        }
    }
杜烨伟
2023-03-14

应该发表评论,但声誉不够。

您应该调用executor上的shutdown。您可以从以下链接获得更多详细信息:在ExecutorService上调用shutdown()的原因

 类似资料:
  • 我有一个线程池为10的executor服务,我希望得到10条打印输出语句,它们之间的间隔为3秒,但我只收到一条打印输出语句。我传递了10作为参数,所以我希望运行10个线程。如何检索未来的10个对象? 我得到的输出是: 线程执行前 结果:123 ArrayList中的期货:123

  • 我正在查询SQL数据库,但由于某些原因,结果项会随机返回。这是我的密码: searchFriendEmailArrayNew是一个电子邮件地址数组,因此当我查询数据库表时,它会使用电子邮件来查找该用户。数组始终保持一致且顺序相同: user1@email.com 查询总是按照这个顺序进行的。 然后,我查询用户的所选字段,在本例中,我查询的是“isriding”字段。此字段是返回true或false

  • 我通过使用Executor服务创建3个线程(extends Runnable)并提交它们来执行主类中的三个任务。如下所示: 当线程中出现异常时,我捕获它并执行System.exit(-1)。但是,如果发生任何异常,我需要返回到主类,并在那里执行一些语句。这怎么做?我们能在没有FutureTask的情况下从这些线程中返回一些东西吗?

  • 问题内容: 为什么更改总和顺序会返回不同的结果? = = 双方的Java和JavaScript的返回相同的结果。 我知道,由于以二进制表示浮点数的方式,某些有理数( 例如1/3-0.333333 … )无法精确表示。 为什么简单地更改元素的顺序会影响结果? 问题答案: 也许这个问题很愚蠢,但是为什么仅仅改变元素的顺序会影响结果呢? 它将根据值的大小更改四舍五入的点。作为示例 _样的_事情,我们所看

  • 为什么改变求和顺序会返回不同的结果? = Java和JavaScript都返回相同的结果。 我知道,由于浮点数在二进制中的表示方式,一些有理数(如1/3-0.333333...)不能精确表示。 为什么简单地改变元素的顺序会影响结果?

  • 问题内容: 是否可以以预定顺序进行声明,即 选择ID 7,2,5,9和8 并以该顺序返回它们 ,仅基于ID字段? 这两个语句以相同顺序返回它们: 问题答案: 我不认为这是可能的,但是在这里找到了一个博客条目,似乎可以满足您的需求: 将给不同的结果 返回给定第二个参数的位置,因此对于上面的第一种情况,7的位置在集合中的位置1,2的位置在2,依此类推-mysql在内部得出类似 然后按的结果排序。