我有一组大约 20 个线程,我想安排它们,以便它们按固定顺序运行。有没有办法做到这一点。我尝试过使用优先级并将优先级设置为 1-10,但调度程序似乎仍然按照自己的顺序执行线程。顺便说一句,我在 Java 中工作
有没有办法按设定的顺序运行线程?
谢谢问候迈克
我有一组大约 20 个线程,我想安排它们,以便它们按固定顺序运行。有没有办法做到这一点。我尝试过使用优先级并将优先级设置为 1-10,但调度程序似乎仍然按照自己的顺序执行线程。顺便说一句,我在 Java 中工作
有没有办法按设定的顺序运行线程?
谢谢问候迈克
您需要一个 ExecutorService 一次运行一个线程,即:newSingleThreadExecutor。
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.submit(job1);
pool.submit(job2);
pool.submit(job3);
如果您首先想要同步行为,为什么要拥有多个线程?
如果您从“其他东西”获取了多个 Thread 对象,那么您可以使用thread.run()
在当前线程中执行它们,这当然可以让您控制顺序。
如果作业可以并行执行,则不必运行单线程版本。下面是一个示例,您可以使用 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 排序来按顺序并行处理项目。
如果线程相互依赖,那么一个选项是只调度第一个线程并让它产生它的依赖线程,然后可以打开它们的依赖线程,等等......
但是,您需要了解,即使您可能以特定顺序启动线程,一旦它们启动,它们就会脱离您的控制,它们将争夺资源并且操作系统将对它们的执行进行时间切片,这意味着有些可能会“领先于”之前启动的线程。所以如果你真的需要保持顺序,那么我建议你只使用一个线程,让它以同步的方式编排任务。