0

我有一组大约 20 个线程,我想安排它们,以便它们按固定顺序运行。有没有办法做到这一点。我尝试过使用优先级并将优先级设置为 1-10,但调度程序似乎仍然按照自己的顺序执行线程。顺便说一句,我在 Java 中工作

有没有办法按设定的顺序运行线程?

谢谢问候迈克

4

4 回答 4

1

您需要一个 ExecutorService 一次运行一个线程,即:newSingleThreadExecutor

 ExecutorService pool = Executors.newSingleThreadExecutor(); 
 pool.submit(job1);
 pool.submit(job2);
 pool.submit(job3);
于 2012-04-27T14:10:03.647 回答
1

如果您首先想要同步行为,为什么要拥有多个线程?

如果您从“其他东西”获取了多个 Thread 对象,那么您可以使用thread.run()在当前线程中执行它们,这当然可以让您控制顺序。

于 2012-04-27T14:09:31.650 回答
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 回答
0

如果线程相互依赖,那么一个选项是只调度第一个线程并让它产生它的依赖线程,然后可以打开它们的依赖线程,等等......

但是,您需要了解,即使您可能以特定顺序启动线程,一旦它们启动,它们就会脱离您的控制,它们将争夺资源并且操作系统将对它们的执行进行时间切片,这意味着有些可能会“领先于”之前启动的线程。所以如果你真的需要保持顺序,那么我建议你只使用一个线程,让它以同步的方式编排任务。

于 2012-04-27T14:08:12.083 回答