太多的期货

Ham*_*aya 5 concurrency clojure

我有一个具有2个功能的函数,一个监视某个事件,另一个监视实际进行的工作,每个函数都在将来运行,一旦事件future返回失败,调用者线程会通知工人future停止。如果辅助线程在接收到事件之前完成,则调用者线程将向观察者发出停止信号,然后调用者返回。

这很好用,但是事情是做实际工作的工作者函数可能需要做的事情是检查线下的其他事件,每次我需要观察某个事件时,我都会开2个额外的期货。问题是,运行的最大期货数量是否有限制?我有时可能会得到60个期货?线程池会根据需要增长吗?并且由于它们在线程池上运行,因此我假设它们的创建成本不是很高?

iru*_*ger 5

这一切都取决于执行者。假设您Executor使用Executors.newFixedThreadPool(n)创建了一个,并向其提交了n * 100个任务,那么运行的线程数将不超过n个。

如果您正在使用Clojure的future函数,它将把您的任务提交给clojure.lang.Agent.soloExecutor。soloExecutor是使用Executors.newCachedThreadPool(threadFactory)创建的,因此它将重用线程并运行尽可能多的线程。