【问题标题】:Thread Scheduling - Run threads in set order线程调度 - 按设定顺序运行线程
【发布时间】:2012-05-08 06:59:18
【问题描述】:

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

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

谢谢 问候 迈克

【问题讨论】:

  • 您的意思是要按顺序运行它们(一个接一个)?
  • 是的,就是这样。很抱歉造成混乱
  • 在那种情况下,你为什么要单独的线程呢?听起来你想要一个线程做 20 件事情,一次一件……
  • 不确定为什么要为此生成 20 个线程。您可以简单地使用带有单线程的ExecutorService 并向其提交作业。编辑:Doh,被 Jon 打败了。
  • 我意识到我无法使用标准 java(和我的操作系统)实现真正的实时,但我正在尝试实现一种能够适应实时的结构,并且需要基于时间的执行并发。难道我的思维方式不对?基本上我正在努力实现硬实时,因此需要一种确定性的方法,对我来说这是顺序固定执行?

标签: java multithreading concurrency scheduled-tasks scheduling


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

     ExecutorService pool = Executors.newSingleThreadExecutor(); 
     pool.submit(job1);
     pool.submit(job2);
     pool.submit(job3);
    

    【讨论】:

      【解决方案3】:

      如果作业可以并行执行,则不必运行单线程版本。下面是一个示例,您可以使用 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()
      
      }
      

      想法是你使用一个辅助队列来维护要处理的项目,并依靠队列的先进先出排序来按顺序并行处理项目。

      【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 我意识到我无法使用标准 java(和我的操作系统)实现真正的实时,但我正在尝试实现一种能够适应实时的结构,并且需要基于时间的执行并发。难道我的思维方式不对?基本上我正在努力实现硬实时,因此需要一种确定性的方法,对我来说这是顺序固定执行?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 2016-03-20
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多