0

約 20 のスレッドのセットがあり、それらをスケジュールして、設定された順序で実行したいと考えています。これを行う方法はありますか。優先度を使用して優先度を 1 ~ 10 に設定しようとしましたが、スケジューラはまだ独自の順序でスレッドを実行しているようです。ところで私はJavaで働いています

設定された順序でスレッドを実行する方法はありますか?

よろしくマイク

4

4 に答える 4

1

ジョブを並行して実行できる場合は、シングルスレッドバージョンを実行する必要はありません。以下は、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順序に依存して、アイテムを順番に並行して処理するという考え方です。

于 2012-04-28T00:45:31.537 に答える
1

そもそも同期動作が必要な場合、なぜ複数のスレッドを使用するのですか?

「何か他のもの」から複数の Thread オブジェクトを取得した場合はthread.run()、それらを現在のスレッドで実行するために使用できます。これにより、もちろん順序を制御できます。

于 2012-04-27T14:09:31.650 に答える
1

必要なのは、一度に 1 つずつスレッドを実行する ExecutorService です。つまり、newSingleThreadExecutorです。

 ExecutorService pool = Executors.newSingleThreadExecutor(); 
 pool.submit(job1);
 pool.submit(job2);
 pool.submit(job3);
于 2012-04-27T14:10:03.647 に答える
0

スレッドが相互に依存している場合、1 つのオプションは、最初のスレッドのみをスケジュールし、依存スレッドを生成することです。これにより、依存スレッドを有効にすることができます。

ただし、特定の順序でスレッドを起動している場合でも、スレッドが開始されるとすぐに手放され、リソースを求めて戦い、OS が実行をタイムスライスすることを理解する必要があります。つまり、一部のスレッドは、以前に起動されたスレッドよりも「先行」する場合があります。したがって、本当に順序を維持する必要がある場合は、スレッドを 1 つだけ使用して、タスクを同期して調整することをお勧めします。

于 2012-04-27T14:08:12.083 に答える