gpt4 book ai didi

java - 使用 ExecutorService 时正在执行的附加任务是什么?

转载 作者:行者123 更新时间:2023-12-01 07:46:24 27 4
gpt4 key购买 nike

我正在学习Java并发。所以在网上找到了这个例子。我编写了以下代码。问题是,即使任务已经执行完毕,看起来还有一些额外的东西正在执行。那么我如何知道正在执行什么?

package com.test.executors;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.*;
import java.util.logging.Logger;

class MyObject {
private Integer number;
private Integer result;

public Integer getNumber() {
return number;
}

public void setNumber(Integer number) {
this.number = number;
}

public Integer getResult() {
return result;
}

public void setResult(Integer result) {
this.result = result;
}
}

class FactorialCalculator implements Callable<MyObject> {

private Integer number;

public FactorialCalculator(Integer number) {
this.number = number;
}

@Override
public MyObject call() throws InterruptedException {
System.out.println(Thread.currentThread().getName() + " started...");
MyObject object = new MyObject();
object.setNumber(number);
int result = 1;
if (0 == number || 1 == number) {
result = 1;
} else {
for (int i = 2; i <= number; i++) {
result *= i;
TimeUnit.SECONDS.sleep(1);
}
}
object.setResult(result);
System.out.println(Thread.currentThread().getName() + " done...");
return object;
}
}

public class ExecutorMain1 {

public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(3);
List<Future<MyObject>> results = new ArrayList<>();
Random random = new Random();
System.out.println("Starting Services...");
for (int i = 0; i < 5; i++) {
Integer number = random.nextInt(10);
Future<MyObject> result = service.submit(new FactorialCalculator(number));
results.add(result);
}

System.out.println("Done submitting tasks...");
System.out.println("Will display results shortly...");

for (Future<MyObject> future : results) {

try {
System.out.println("Number: " + future.get().getNumber() + "--> Result: " + future.get().getResult() + " Task Status: " + future.isDone());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
System.out.println("Exiting main...");
}
}

输出是-

Starting Services...
Done submitting tasks...
Will display results shortly...
pool-1-thread-2 started...
pool-1-thread-2 done...
pool-1-thread-2 started...
pool-1-thread-2 done...
pool-1-thread-2 started...
pool-1-thread-2 done...
pool-1-thread-1 started...
pool-1-thread-1 done...
Number: 6--> Result: 720 Task Status: true
Number: 5--> Result: 120 Task Status: true
pool-1-thread-3 started...
pool-1-thread-3 done...
Number: 4--> Result: 24 Task Status: true
Number: 0--> Result: 1 Task Status: true
Number: 1--> Result: 1 Task Status: true
Exiting main...

Exiting main...之后,程序还没有退出。它挡住了某物。提交的5个任务也完成了。那么正在执行什么?我如何找到它?

最佳答案

当有非守护线程运行时,JVM 将不会退出。并且您的 ExecutorService 创建非守护进程工作线程。因此,要允许 JVM 终止,您需要关闭执行程序服务。由于所有任务都已完成,因此可以调用 shutdown()shutdownNow()

关于java - 使用 ExecutorService 时正在执行的附加任务是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51068155/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com