したがって、固定スレッドプールがどのように機能するか(Javaに組み込まれたExecutor.fixedThreadPoolを使用)はある程度理解していると思いますが、私が見ることができることから、通常は実行したいジョブの数が設定されており、開始時にいくつになるかがわかります。プログラム。例えば
int numWorkers = Integer.parseInt(args[0]);
int threadPoolSize = Integer.parseInt(args[1]);
ExecutorService tpes =
Executors.newFixedThreadPool(threadPoolSize);
WorkerThread[] workers = new WorkerThread[numWorkers];
for (int i = 0; i < numWorkers; i++) {
workers[i] = new WorkerThread(i);
tpes.execute(workers[i]);
}
各workerThreadが本当に単純なことを行う場合、その部分は任意です。私が知りたいのは、プールサイズが固定されている(たとえば最大8)が、実行時までタスクを完了するために必要なワーカーの数がわからない場合はどうなるかということです。
具体的な例は次のとおりです。プールサイズが8で、標準入力から読み取っている場合。読みながら、入力を設定されたサイズのブロックに分割しました。これらのブロックのそれぞれは、圧縮できるように(他の情報とともに)スレッドに渡されます。そのため、入力の最後に到達するまで続行する必要があるため、作成する必要のあるスレッドの数がわかりません。また、データが同じ順序に保たれるようにする必要もあります。スレッド2がスレッド1の前に終了し、その作業を送信しただけの場合、私のデータは故障します!
この状況では、スレッドプールは間違ったアプローチでしょうか?それは素晴らしいことのようです(一度に8つ以上のスレッドを使用することはできないので)。
基本的に、私はこのようなことをしたいと思います:
ExecutorService tpes = Executors.newFixedThreadPool(threadPoolSize);
BufferedInputStream inBytes = new BufferedInputStream(System.in);
byte[] buff = new byte[BLOCK_SIZE];
byte[] dict = new byte[DICT_SIZE];
WorkerThread worker;
int bytesRead = 0;
while((bytesRead = inBytes.read(buff)) != -1) {
System.arraycopy(buff, BLOCK_SIZE-DICT_SIZE, dict, 0, DICT_SIZE);
worker = new WorkerThread(buff, dict)
tpes.execute(worker);
}
これは機能するコードではありませんが、私は自分が欲しいものを説明しようとしているだけです。
少し省略しましたが、buffとdictの値がどのように変化するか、入力の長さがわからないことを確認してください。最初の電話の後ですでによく働く人がいるので、私は実際にこの考えをすることができないと思います!私はworker=new WorkerThreadと言うことはできません。なぜなら、それはすでに既存のスレッド(true、死んでいる可能性のあるスレッド)を指しているのではないからです。明らかに、この実装では、それが機能した場合、私は実行しません。並行して。しかし、私のポイントは、最大プールサイズに達するまでスレッドを作成し続け、スレッドが完了するまで待ってから、入力の最後に達するまでスレッドを作成し続けることです。
また、物事を整理する必要があります。これは本当に厄介な部分です。