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