0

我试图找出,完成第一个线程后比开始第二个线程,完成第二个线程后比开始第三个线程,请帮助我!

这是我的代码:

public class wait {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("First Thread");

        createtheard2();
    }

    public static void createtheard2() {

        try {

            System.out.println("Second Thread");

        } catch(Exception error1) {
            error1.printStackTrace();
        }

        createtheard3();
    }

    public static void createtheard3() {

        try {

            System.out.println("Third Thread");

        } catch(Exception error1) {
            error1.printStackTrace();
        }
    }
}

完成第一个线程后,启动第二个线程,完成第二个线程后,启动第三个线程,请帮助我!谢谢!!

4

3 回答 3

2
  1. 实现可运行

    公共类 ThreadDemo 实现 Runnable {  
           公共无效运行(){
              //做你需要的
           }
    }
  2. 使用 join 等待线程完成。

    线程 t1 = 新线程(新线程演示());
    // 这将调用 run() 函数
    t1.start();
    // 等待这个线程终止
    t1.join();
    
    线程 t2 = 新线程(新线程演示());
    // 这将调用 run() 函数
    t2.start();
    // 等待这个线程终止
    t2.join();

来自http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html

t.join() 导致当前线程暂停执行,直到 t 的线程终止。

在您的情况下,由加入方法调用暂停的线程将是主线程。

于 2013-07-25T15:23:24.003 回答
0

我认为您需要的是,如果任务 1(用您的术语来说是线程)成功,则运行任务 2,否则等待任务 1。考虑以下。

public class Process{

    public static void runProcess1() {

        boolean done = false;
        do {
            // make done=true after task1 is done
        } while (done);
        runProcess2();
    }

    public static void runProcess2() {

        boolean done = false;
        do {
            // make done=true after task2 is done
        } while (done);
        runProcess3();
    }

    public static void main(String[] args) {
        runProcess1();
    }
}
于 2013-07-25T15:30:37.723 回答
0

正如所指出的,在这种情况下使用线程没有意义,因为您是按顺序执行任务。

但是,可以使用SingleThreadExecutor一次运行一个线程

例如,你

  1. 将您的线程添加到“待办事项列表”(ArrayList将完成这项工作)
  2. 安排任务 ( ExecutorService.execute())
  3. 等待计划任务完成 ( Thread.join())
  4. 从“待办事项列表”中删除线程tasks.remove(currentTask);
  5. 选择下一个任务或如果全部完成则转到步骤 7
  6. 返回第 2 步
  7. 杀死 ExecutorService ( ExecutorService.shutdown())

或者,您可以使用ExecutorService.invokeAll()单线程执行程序。

您甚至可以简单地直接在循环中运行任务,调用start(),但是,我真的建议不要在不必要的情况下使用并发。

于 2013-07-25T15:30:38.033 回答