我想从队列中提取多个文件并同时解析它们。但是,我的执行者只调用一个线程:
private static ScheduledExecutorService parsingExec ;
protected static BlockingQueue<Path> queue = new LinkedBlockingQueue<>();
int threadPoolSize = 10;
parsingExec = Executors.newScheduledThreadPool(threadPoolSize);
parsingExec.scheduleAtFixedRate(new MyParser(queue), 0, 0, TimeUnit.MILLISECONDS);
答案 0 :(得分:6)
来自scheduleWithFixedRate()
的Javadoc:
创建并执行首先启用的定期操作 在给定的初始延迟之后,以及随后的给定时期; 那是执行将在initialDelay之后开始 initialDelay + period,然后是initialDelay + 2 * period,依此类推。如果有的话 执行任务遇到异常,后续执行 被压制了。否则,任务将仅通过终止 取消或终止遗嘱执行人。如果有任何执行 任务花费的时间比其周期长,然后可能会执行后续执行 迟到,但不会同时执行。
此方法用于调度单个任务,多次执行。需要注意的关键是,一次只执行一个任务实例。如果您想同时执行多个任务,那么您应该使用例如固定的线程池。
final ExecutorService parsingExec = Executors.newFixedThreadPool(threadPoolSize);
for(final int i = 0; i < threadPoolSize; i++) {
parsingExec.submit(new MyParser(queue));
}
答案 1 :(得分:0)
parsingExec.scheduleAtFixedRate(new MyParser(queue), 0, 1, TimeUnit.MILLISECONDS);
此行计划一个Runnable。你必须为你想要的每个线程调用此行一次simultaniusly。我认为你应该拆分queue
并将拆分的部分交给你的构造函数,并为每个部分安排一次。另外scheduleAtFixedRate
永远重复这项工作,我想你不想要这种行为。
如果您只想使用submit
执行此操作,请执行此操作:
//split the queue in parts before
for(int i = 0; i < numberOfQueueParts; i++) {
parsingExec.submit(new MyParser(queuePart));
}