ScheduledExecutorService只调用一个线程

时间:2013-01-28 15:41:16

标签: java concurrency executorservice

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

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

2 个答案:

答案 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));
}