我有应该按照请求尽快执行的代码。 #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}线程将是活动的处理任务。 如果在所有线程都处于活动状态时提交了其他任务, 他们将在队列中等待,直到线程可用为止。
答案 0 :(得分:0)
上述代码的一个问题是ExecutorService executorService = Executors.newFixedThreadPool(4);
在函数内部。因此,每次都会初始化一个新池,从而留下许多未清除的线程。
FixedThreadPool服务必须在函数调用之外且只能在ONCE上初始化。另外,如果需要大量线程,则5K线程很大,请确保适当地调整内存大小。