Java 使用ExecutorService但在执行提交的任务后停止 执行者即使已完成执行任务也未停止

Java 使用ExecutorService但在执行提交的任务后停止 执行者即使已完成执行任务也未停止,java,multithreading,executorservice,Java,Multithreading,Executorservice,您没有提供足够的详细信息来解决您的问题。下面是一个与您类似的完整工作代码示例 提示:在嵌入Java之前,让您的代码像普通Java一样工作 常规语法 首先,我们使用当今Java的常规语法 守则的主要部分: ExecutorService ExecutorService=Executors.newSingleThreadExecutor(); 对于(int i=0;i

您没有提供足够的详细信息来解决您的问题。下面是一个与您类似的完整工作代码示例

提示:在嵌入Java之前,让您的代码像普通Java一样工作

常规语法 首先,我们使用当今Java的常规语法

守则的主要部分:

ExecutorService ExecutorService=Executors.newSingleThreadExecutor();
对于(int i=0;i<7;i++)
{
提交(新的PrintUuid());
}
executorService.shutdown();
请尝试{executorService.awaitTermination(Long.MAX_值,TimeUnit.millizes);}catch(InterruptedException e){e.printStackTrace();}
一个完整的示例应用程序

package work.basil.example.simple;
导入java.time.Duration;
导入java.time.Instant;
导入java.util.UUID;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.concurrent.TimeUnit;
公共类应用程序
{
公共静态void main(字符串[]args)
{
App App=新App();
app.demo();
}
私有void演示()
{
System.out.println(“INFO-End'demo'method.+Instant.now());
ExecutorService ExecutorService=Executors.newSingleThreadExecutor();
对于(int i=0;i<7;i++)
{
提交(新的PrintUuid());
}
executorService.shutdown();
请尝试{executorService.awaitTermination(Long.MAX_值,TimeUnit.millizes);}catch(InterruptedException e){e.printStackTrace();}
System.out.println(“INFO-End'demo'method.+Instant.now());
}
类PrintUuid实现可运行
{
@凌驾
公开作废运行()
{
尝试{Thread.sleep(Duration.ofSeconds(2).toMillis());}catch(InterruptedException e){e.printStackTrace();}
UUID UUID=UUID.randomUUID();
System.out.println(“uuid=“+uuid+”在“+Instant.now()+”处通过线程ID#“+thread.currentThread().getId());
}
}
}
作为调试的一部分,让代码完全按照编写的代码在应用程序中工作。然后转换到实际任务以并行运行。完成所有工作后,将代码移动到JSP中

项目织机 将带来Java并发设施的创新。基于早期访问Java 17的实验构建是

正在考虑的更改之一是创建接口。这意味着我们可以使用语法。只有在完成所有提交的任务后,控制流才会通过
try

一个较小的变化是对java.time类的支持。这包括在休眠当前线程时使用
int
毫秒计数作为替代

package work.basil.example.simple;
导入java.time.Duration;
导入java.time.Instant;
导入java.util.UUID;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.concurrent.TimeUnit;
公共类应用程序
{
公共静态void main(字符串[]args)
{
App App=新App();
app.demo();
}
私有void演示()
{
System.out.println(“INFO-End'demo'method.+Instant.now());
试一试(
ExecutorService ExecutorService=Executors.newSingleThreadExecutor();
)
{
对于(int i=0;i<7;i++)
{
提交(新的PrintUuid());
}
}
//在这一点上,控制块的流动将停止,直到所有提交的任务完成/取消/失败。
//在这一点之后,executor服务将自动关闭,由try with resources语法调用一个“close”方法。
System.out.println(“INFO-End'demo'method.+Instant.now());
}
类PrintUuid实现可运行
{
@凌驾
公开作废运行()
{
尝试{Thread.sleep(Duration.ofSeconds(2));}catch(InterruptedException e){e.printStackTrace();}
UUID UUID=UUID.randomUUID();
System.out.println(“uuid=“+uuid+”在“+Instant.now()+”处通过线程ID#“+thread.currentThread().getId());
}
}
}
这是我的全部代码

公共作废处理活动存款(
活动(活动){
整数分区大小=
getProperty(“pation.size”,Integer.class,1000);
列出记录=
service.FindProcessRecords(
activity.getActivityId(),
分区大小);
if(records!=null&&records.size()>0){
试一试{
int线程池大小=
getProperty(“thread.pool.size”,Integer.class,10);
ExecutorService ExecutorService=Executors.newFixedThreadPool(threadPoolSize);
用于(长活动ID:记录){
executorService.execute(
新ActivityDepositInternalProcessor(
活动ID);
}
executorService.shutdown();
试一试{
executorService.awaitTermination(Long.MAX_值,时间单位为毫秒);
}捕捉(中断异常e){
e、 printStackTrace();
}
加工活动存款(
活动);
}捕获(异常){
异常。printStackTrace();
}
}
}

您向executor service提交了哪些任务?他们显然花了很长时间。这是我的全部代码,我发布为答案。这是我的全部代码,我发布为另一个答案
    Here am calling awaitTermination to wait until all executing tasks to be completed here the problem is, it's not terminating executor service for a long time, once stopping server then only getting InterruptedException otherwise it's waiting until unless we are stopping the server, not sure what am missing here, is this reason  Long.MAX_VALUE, TimeUnit.MILLISECONDS its not terminates even completed submitted tasks? Thanks.

<pre><code>
      executorService.shutdown();
      try {
        executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
</code></pre>
public void processActivityDeposits(
    Activity activity) {
  int partitionSize =
      environment.getProperty("patition.size", Integer.class, 1000);
  List<Long> records =
      service.findReadyToProcessRecords(
          activity.getActivityId(),
          partitionSize);
  if (records != null && records.size() > 0) {
    try {
      int threadPoolSize =
          environment.getProperty("thread.pool.size", Integer.class, 10);
      ExecutorService executorService = Executors.newFixedThreadPool(threadPoolSize);
      for (Long activityId : records) {
        executorService.execute(
            new ActivityDepositInternalProcessor(
                activityId));
      }
      executorService.shutdown();
      try {
        executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      processActivityDeposits(
          activity);
    } catch (Exception exception) {
      exception.printStackTrace();
    }
  }
}