当前位置: 首页 > 知识库问答 >
问题:

如何逐级执行所有线程

况浩邈
2023-03-14

如果每个任务(线程)有多个阶段。那么如何确保所有任务执行第1阶段,然后执行第2阶段,依此类推。例如如何修改下面的代码,使我的输出为:Task1的第1阶段、Task2的第1阶段、Task3的第1阶段、Task1的第2阶段、Task2的第2阶段、Task3的第2阶段,依此类推...

public class Task implements Runnable{
    public String name;
    static Random random = new Random();

    Task(String name){
        this.name=name;
    }

    public static void main(String args[]) {
        ExecutorService ex = Executors.newFixedThreadPool(6);
        ex.submit(new Task("Task 1"));
        ex.submit(new Task("Task 2"));
        ex.submit(new Task("Task 3"));
    }

    public static void getRandomsleep() {
         try {
                Thread.sleep(random.nextInt(5000));
            } catch (InterruptedException e) {
                // ...
            }   }

    public void run() {
        System.out.println("thread name" + this.name);
        getRandomsleep();
        System.out.println("stage 1 of " + this.name);
        getRandomsleep();
        System.out.println("stage 2 of " + this.name);
        getRandomsleep();

    }
}

共有1个答案

杨彦君
2023-03-14

您可以使用CyclicBarrier来解决此类问题。

public class CyclicBarrierDemo {

  public static void main(String args[]) {
    CyclicBarrier barrier = new CyclicBarrier(3);
    ExecutorService ex = Executors.newFixedThreadPool(3);
    ex.submit(new Task("Task 1", barrier));
    ex.submit(new Task("Task 2", barrier));
    ex.submit(new Task("Task 3", barrier));
  }

  static class Task implements Runnable {
    String name;
    CyclicBarrier barrier;

    Task(String name, CyclicBarrier barrier) {
      this.name = name;
      this.barrier = barrier;
    }

    void doWork() {
      try {
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        // ...
      }
    }

    public void run() {
      for (int i = 1; i <= 3; i++) {
        System.out.println("stage " + i + " of " + this.name);
        doWork();
        try {
          barrier.await();
        } catch (InterruptedException | BrokenBarrierException e) {
          return;
        }
      }
    }
  }
}
stage 1 of Task 1
stage 1 of Task 2
stage 1 of Task 3
stage 2 of Task 1
stage 2 of Task 2
stage 2 of Task 3
stage 3 of Task 3
stage 3 of Task 1
stage 3 of Task 2
 类似资料:
  • 问题内容: 现在我想在进入for循环之前集中所有任务,但是当我运行此程序时,for循环会在此之前执行并引发此异常: 问题答案: 一种工作方式是,当您调用它时,它等待所有任务完成: 执行给定的任务,并在所有任务完成时返回保存其状态和结果的期货列表。Future.isDone()对于返回列表的每个元素为true。 请注意,已完成的任务可能已正常终止或引发了异常而终止 。如果在进行此操作时修改了给定的集

  • 我有一个python脚本,所以我在python中使用线程模块并发执行。 def run(self):db=MySQLdb。connect('localhost','mytable','user','mytable')游标=db。cursor()query=“dig short”str(反向ip)”按键try:output=子进程。检查\u输出(查询,shell=True)输出\u编辑=输出。条带(

  • 更新了问题和图像。 是否有任何方法可以暂停所有线程,直到任何线程执行samplerA为止(不管线程数是多少,这只需要执行一次),在执行这个sampler之后,所有线程都可以继续执行。单击以获取图像

  • 问题内容: 根据我一直在阅读的定义: 线程基本上是并发(同时)运行的代码段 。 但是,如何在存在线程调度程序的情况下同时运行它们? 我读到,线程调度程序基本上是从线程池中随机选择一个线程在某个时刻运行。从中我得到一个确切的时间点,只有一个可运行线程真正处于运行状态(运行)。( 所有这些均来自SCJP Sun认证程序员学习指南 )有人可以澄清吗? 这些线程是否真正同时运行? 问题答案: 但是,如何在

  • 我正在尝试从我的测试套件中运行所有测试,但是当我运行命令时,PHPUnit没有找到测试。我在phpunit中配置testsuite。xml。 phpunit。xml 独自创立php WebTestCase。php TestPage.php 如果我通过文件测试运行phpunit,则为,可以。

  • 我希望所有执行器endpoint(在文档中描述)都可用。在文档之后,添加了启动器启动器依赖项和属性,但大多数endpoint不可用(HTTP 404)。 唯一可用的endpoint是,但它显示无用的信息: 添加属性。 添加了依赖项: 获取/执行器的结果 启用执行器endpoint的最小设置是什么?