线程调度 - 按设置顺序运行线程

时间:2012-04-27 14:04:30

标签: java multithreading concurrency scheduled-tasks scheduling

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

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

由于 问候 迈克

4 个答案:

答案 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)

如果线程彼此依赖,那么一个选项是仅调度第一个线程并让它产生其依赖线程,然后可以转换它们的相关线程等......

然而,您需要了解,即使您可能按特定顺序启动线程,但一旦启动它们就会失控,他们将争取资源,操作系统会对执行时间进行分时,这意味着有些人可能会“领先”之前推出的线程。因此,如果您确实需要保留订单,那么我建议您只使用一个线程并让它以同步方式协调任务。