0

キューから複数のファイルをプルして同時に解析したい。ただし、私のエグゼキュータは1つのスレッドのみを呼び出しています。

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*期間の後に開始されます。タスクの実行で例外が発生した場合、それ以降の実行は抑制されます。それ以外の場合、タスクはエグゼキュータのキャンセルまたは終了によってのみ終了します。このタスクの実行にその期間よりも長い時間がかかる場合、後続の実行は遅れて開始される可能性がありますが、同時に実行されることはありません。

この方法は、1つのタスクを複数回実行するようにスケジュールするためのものです。注意すべき重要な点は、タスクの1つのインスタンスのみが一度に実行されることになるということです。複数のタスクを同時に実行する場合は、代わりに、たとえば固定スレッドプールを使用する必要があります。

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

この行は、1つのRunnableをスケジュールします。同時にスケジュールするスレッドごとに、この行を1回呼び出す必要があります。queueを分割してコンストラクターに渡し、パーツごとに1回スケジュールする必要があると思います。また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 に答える