gpt4 book ai didi

java - 执行器服务关闭

转载 作者:行者123 更新时间:2023-12-02 02:39:54 25 4
gpt4 key购买 nike

我正在使用ExecutorService。我正在为 for 循环 打开 10 个线程。所以它打开了 10 个线程,并且连接什么时候关闭?在 executor.shutdown() 处?如果是,它会关闭所有 10 个线程并再次打开 10 个线程吗?我可以遵循更好的编码标准来提高这里的性能吗?

ExecutorService executor = Executors.newFixedThreadPool(10);
for(String str : stringList){
for(String str1 : stringList1){
for(String str2 : stringList2){
executor.execute(new Runnable() {
@Override
public void run() {
//do something
}
}
}
}
executor.shutdown();
executor.awaitTermination(24L, TimeUnit.HOURS);

实际上我的想法是迭代循环并将数据保存在文件中并为每次迭代保存它。因此,我想遵循这里的最佳实践,因为我不想在后期看到任何与服务器相关的问题,例如连接问题/outOfMemory 异常。请建议。

我自己实现了这个,但我是多线程方面的菜鸟。因此,为了在看到其他一些博客和帖子后得到一些澄清,我发布了此内容。请帮忙!

最佳答案

Executors.newFixedThreadPool(10) 的作用正如其听起来的那样 - 它创建一个线程池,最多有 10 个线程。来自 the documentation :

The threads in the pool will exist until it is explicitly shutdown

因此,最佳实践是尽可能共享线程池。 不要这样做:

for (int i = 0; i < 8; i++) {
ExecutorService executor = Executors.newFixedThreadPool(10);

for (String str1 : stringList1) {
for (String str1 : stringList1) {
executor.execute(new Runnable(){
public void run(){ /* Some work... */ }
});
}
}
executor.shutdown();
executor.awaitTermination(24L, TimeUnit.HOURS);
}

请注意,一个新的 FixedThreadPool 在 for 循环中创建和销毁了 8 次,并且创建/销毁线程池最多会创建/销毁 10 个线程。这很糟糕,因为它违背了使用线程池的目的。如果您要在循环中使用池,请确保在可以的地方重复使用它:

ExecutorService executor = Executors.newFixedThreadPool(10);

for (int i = 0; i < 8; i++) {
for (String str1 : stringList1) {
for (String str1 : stringList1) {
executor.execute(new Runnable(){
public void run(){ /* Some work... */ }
});
}
}
}

executor.shutdown();
executor.awaitTermination(24L, TimeUnit.HOURS);

最后,要注意的最后一件事是您排队的工作量。如果您对工作进行排队的速度比线程池处理它的速度快,那么队列大小将缓慢增长,直到出现 OutOfMemoryException。不幸的是,没有内置的方法来检查线程池中剩余的任务数量,因此您必须自己解决这个问题。

这个概念也适用于服务器 - 如果每秒传入的请求数高于服务器每秒可以处理的请求数,并且持续时间足够长,那么服务器将耗尽资源并崩溃。解决方案通常是自动扩展和负载平衡,并且了解如何配置这些东西是业内非常有用的技能。

关于java - 执行器服务关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45668057/

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