0

我想从队列中提取多个文件并同时解析它们。但是,我的执行程序只调用一个线程:

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);
4

2 回答 2

9

来自 Javadoc 的scheduleWithFixedRate()

创建并执行一个周期性动作,该动作在给定的初始延迟后首先启用,随后在给定的周期内启用;也就是说,执行将在 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));
}
于 2013-01-28T16:08:55.483 回答
0
parsingExec.scheduleAtFixedRate(new MyParser(queue), 0, 1, TimeUnit.MILLISECONDS);

此行计划一个 Runnable。您必须为要同时安排的每个线程调用一次此行。我认为您应该拆分queue并将拆分的部分提供给您的构造函数,并为每个部分安排一次。也scheduleAtFixedRate永远重复工作,我认为你不希望这种行为。如果您只想执行一次,请submit改用:

//split the queue in parts before
for(int i = 0; i < numberOfQueueParts; i++) {
    parsingExec.submit(new MyParser(queuePart));
}
于 2013-01-28T16:09:22.877 回答