2

我必须运行多个线程 || 并且在执行所有这些线程后主线程继续。例如,我有一个主线程和 3 个子线程,我的需要是

run main thread
pause main thread
run all 3 sub threads ||ly
after complition resume main thread

我创建了一个类extends Thread并调用了所有这些线程的 start 方法,但这并没有解决我的问题。

我的代码:

for (MyThread myThread : myThreads) {
    myThread.start();
}

感谢帮助。

4

4 回答 4

3

尝试使用Thread.join();

public class ThreadDemo implements Runnable {

   public void run() {

      Thread t = Thread.currentThread();
      System.out.print(t.getName());
      //checks if this thread is alive
      System.out.println(", status = " + t.isAlive());
   }

   public static void main(String args[]) throws Exception {

      Thread t = new Thread(new ThreadDemo());
      // this will call run() function
      t.start();
      // waits for this thread to die
      t.join();
      System.out.print(t.getName());
      //checks if this thread is alive
      System.out.println(", status = " + t.isAlive());
   }
} 

输出:

Thread-0, status = true
Thread-0, status = false

这是一个堆栈溢出链接供参考。

于 2013-08-12T12:36:28.667 回答
1

忘记“暂停”线程。你的日程安排应该是

  1. 在 X 线程上启动 X 动作
  2. 等待所有线程完成
  3. 处理结果(如果有)

那么如何等待线程完成呢?你需要一个同步机制。这些通常是操作系统级别的“标志”,称为信号量,但 java 库为您提供了几种方法。您将从本系列中收获很多,尤其是第 2 部分:线程同步

于 2013-08-12T12:36:51.120 回答
0

您可以在线程上调用 join() 。假设您的线程在 myThreads 中,并且您不希望线程可中断

// ...
// create threads and start them
// ...
for (Thread t : myThreads) {
    while (t.isAlive()) {
        try {
            t.join();
        } catch (InterruptedException e) { }
    }
}

如果它应该是可中断的:

// ...
// create threads and start them
// ...
for (Thread t : myThreads)
    t.join();
于 2013-08-12T12:34:25.123 回答
0

那么CountDownLatch的机制要灵活得多Thread.join。它完全符合您的要求。更喜欢java.util.concurrent.*而不是旧的内置 Java 技术。

优点:

  1. 使用 CDL,您可以处理单个对象而不是一堆线程。这可以简化代码。
  2. 它有一个getCount()可以用来实现进度条的方法。使用joins 则要复杂得多。
  3. await(long timeout, TimeUnit unit)可以认为比join(long millis)
于 2013-08-12T13:01:38.317 回答