Java代码多线程,等待启动其他



我正在努力找出,在完成第一个线程后比开始第二个线程完全,在完成第二个螺纹后比开始第一个线程更,请帮帮我!!

这是我的代码:

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();
        }
    }
}

完成第一个线程后,比开始第二个线程,完成第二个螺纹后,比启动第三个线程,请帮帮我!!谢谢

  1. 实现可运行

    公共类ThreadDemo实现了Runnable{public void run(){//你需要什么就做什么}}
  2. 使用联接等待线程完成。

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

发件人http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html

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

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

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

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();
    }
}

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

然而,使用SingleThreadExecutor 一次可以运行一个线程

例如,您的

  1. 将您的线程添加到"待办事项列表"(ArrayList将完成此任务)
  2. 安排任务(ExecutorService.execute()
  3. 等待计划任务完成(Thread.join()
  4. 从"待办事项列表"tasks.remove(currentTask);中删除线程
  5. 选择下一个任务,如果所有任务都已完成,则转到步骤7
  6. 返回步骤2
  7. 终止ExecutorService(ExecutorService.shutdown()

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

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

最新更新