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