即使使用Executors.fixedThreadPool也无法启动线程

时间:2020-07-20 19:23:01

标签: java multithreading

我有应该按照请求尽快执行的代码。 #W A T C H E R @bot.event async def on_message(message): # L O G G I N G username = message.author.display_name msg = message.content with open('blacklist.txt', 'r') as f: blacklist = f.read() if message.author.bot: return elif msg.lower() in blacklist: await message.delete() else: await bot.process_commands(message) 在内部使用dataFetcher来调用我在本地主机上的服务器。 JDK文档指出这是一个阻塞调用。

client.send(request, HttpResponse.BodyHandlers.ofString()).body();

当我将参数private static void callServer(DataFetcher dataFetcher, int times) { ExecutorService executorService = Executors.newFixedThreadPool(4); for (int i = 0; i < times; i++) { executorService.submit(dataFetcher::fetch); } } 设置为足够大的数字(如5000)时,我会遇到类似以下的错误:

times

我的问题是,考虑到我们使用固定线程池,怎么可能出现这样的错误。 JRE为什么要尝试旋转新线程?我还在服务器(使用AtomicInteger)上计算了已完成的请求,看来只有一部分所需的连接正在建立。

这是.newFixedThreadPool()方法的文档:

创建一个重用固定数量线程的线程池 在共享的无界队列中操作。在任何时候,最多 {@code nThreads}线程将是活动的处理任务。 如果在所有线程都处于活动状态时提交了其他任务, 他们将在队列中等待,直到线程可用为止。

1 个答案:

答案 0 :(得分:0)

上述代码的一个问题是ExecutorService executorService = Executors.newFixedThreadPool(4);在函数内部。因此,每次都会初始化一个新池,从而留下许多未清除的线程。

FixedThreadPool服务必须在函数调用之外且只能在ONCE上初始化。另外,如果需要大量线程,则5K线程很大,请确保适当地调整内存大小。

相关问题