繁体   English   中英

ScheduledExecutorService仅调用一个线程

[英]ScheduledExecutorService only calling one thread

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM