約 20 のスレッドのセットがあり、それらをスケジュールして、設定された順序で実行したいと考えています。これを行う方法はありますか。優先度を使用して優先度を 1 ~ 10 に設定しようとしましたが、スケジューラはまだ独自の順序でスレッドを実行しているようです。ところで私はJavaで働いています
設定された順序でスレッドを実行する方法はありますか?
よろしくマイク
約 20 のスレッドのセットがあり、それらをスケジュールして、設定された順序で実行したいと考えています。これを行う方法はありますか。優先度を使用して優先度を 1 ~ 10 に設定しようとしましたが、スケジューラはまだ独自の順序でスレッドを実行しているようです。ところで私はJavaで働いています
設定された順序でスレッドを実行する方法はありますか?
よろしくマイク
ジョブを並行して実行できる場合は、シングルスレッドバージョンを実行する必要はありません。以下は、8つのスレッドを使用して20のジョブを実行できる例です。
public static void main(String[] args) {
final ExecutorService executorService = Executors.newFixedThreadPool(8);
final Queue<Integer> workItems = new ConcurrentLinkedQueue<Integer>();
for (int i = 0; i < 20; i++) {
workItems.add(i);
}
for (int i = 0; i < 20; i++) {
executorService.submit(new Runnable() {
@Override
public void run() {
final Integer workIem = workItems.poll();
// process work item
}
});
}
// await termination of the exec service using shutdown() and awaitTermination()
}
補助キューを使用して処理するアイテムを維持し、キューのFIFO順序に依存して、アイテムを順番に並行して処理するという考え方です。
そもそも同期動作が必要な場合、なぜ複数のスレッドを使用するのですか?
「何か他のもの」から複数の Thread オブジェクトを取得した場合はthread.run()
、それらを現在のスレッドで実行するために使用できます。これにより、もちろん順序を制御できます。
必要なのは、一度に 1 つずつスレッドを実行する ExecutorService です。つまり、newSingleThreadExecutorです。
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.submit(job1);
pool.submit(job2);
pool.submit(job3);
スレッドが相互に依存している場合、1 つのオプションは、最初のスレッドのみをスケジュールし、依存スレッドを生成することです。これにより、依存スレッドを有効にすることができます。
ただし、特定の順序でスレッドを起動している場合でも、スレッドが開始されるとすぐに手放され、リソースを求めて戦い、OS が実行をタイムスライスすることを理解する必要があります。つまり、一部のスレッドは、以前に起動されたスレッドよりも「先行」する場合があります。したがって、本当に順序を維持する必要がある場合は、スレッドを 1 つだけ使用して、タスクを同期して調整することをお勧めします。