Мне было любопытно узнать о Quasar и его легких волокнах в качестве замены потоков. Изучив их документацию по API, я не смог понять, как перейти к преобразованию типичного ThreadPoolExecutor в пул волокон.
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 исполняемых объектов, они будут выполняться по 10 за раз в пуле, 10 ставятся в очередь, а основной поток сам выбирает исполняемый объект до тех пор, пока другие не будут завершены, после чего основной поток возвращается к добавлению исполняемых модулей в исполняющую программу.
Как бы вы сделали это с помощью Quasar's Fibers? Он предназначен для использования в качестве такового в первую очередь?
РЕДАКТИРОВАТЬ: мой первоначальный вопрос был плохо сформулирован. По сути, я пытался найти механизм ограничения количества одновременно работающих волокон. Например, не запускайте больше волокон, если уже запущено 200 волокон. Если запущено максимальное количество волокон, дождитесь окончания работы одного из них, прежде чем запускать новый.