我一直对 Quasar 及其轻量级 Fibers 作为 Threads 的替代品感到好奇。在查阅了他们的API 文档后,我无法弄清楚如何将典型的ThreadPoolExecutor转换为 Fibers 池。
int maxThreadPoolSize = 10;
ThreadPoolExecutor executor = new ThreadPoolExecutor(
maxThreadPoolSize,
maxThreadPoolSize,
10, TimeUnit.MINUTES,
new ArrayBlockingQueue<Runnable>(maxThreadPoolSize),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy()
);
for (int i = 0; i < 100; i++) {
executor.execute(new Runnable() {
@Override
public void run() {
// run some code
}
});
}
上面的代码创建了一个有 10 个线程的池,池前面的一个队列可以容纳 10 个元素和一个拒绝策略(当队列满时)让主线程自己执行一个 Runnable 任务。由于for循环创建了100个runnable,它们将在池中一次执行10个,10个排队,主线程自己拿起一个Runnable,直到其他线程完成,之后主线程返回将Runnables添加到executor。
您将如何使用 Quasar 的 Fibers 来做到这一点?它是不是一开始就应该这样使用?
编辑:我最初的问题措辞不佳。本质上,我试图找到一种机制来限制可以同时运行的 Fiber 数量。例如,如果已经有 200 个 Fiber 在运行,则不要启动更多 Fiber。如果最大数量的光纤正在运行,请等到一个完成后再启动一个新的。