疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java中线程顺序执行


 

  现有线程threadone、threadtwo和threadthree,想要的运行顺序为threadone->threadtwo->threadthree,应该如何处理?这里需要用到一个简单的线程方法join().

  join()方法的说明:join方法挂起当前调用线程,直到被调用线程完成后在继续执行(join() method suspends the execution of the calling thread until the object called finishes its execution).

  下面看一个例子:

  /**

  * Thread one for test.

  */

  public class ThreadOne implements Runnable {

  @Override

  public void run() {

  String threadName = Thread.currentThread().getName();

  System.out.println(threadName + " start...");

  System.out.println(threadName + " end.");

  }

  }

  /**

  * Thread two for test.

  */

  public class ThreadTwo implements Runnable {

  @Override

  public void run() {

  String threadName = Thread.currentThread().getName();

  System.out.println(threadName + " start...");

  System.out.println(threadName + " end.");

  }

  }

  /**

  * Thread three for test.

  */

  public class ThreadThree implements Runnable {

  @Override

  public void run() {

  String threadName = Thread.currentThread().getName();

  System.out.println(threadName + " start...");

  System.out.println(threadName + " end.");

  }

  }

  public class JoinMainTest {

  public static void main(String[] args) {

  String threadName = Thread.currentThread().getName();

  System.out.println(threadName + " start...");

  Thread firstThread = new Thread(new ThreadOne());

  Thread secondThread = new Thread(new ThreadTwo());

  Thread thirdThread = new Thread(new ThreadThree());

  // 1. no order thread run

  firstThread.start();

  secondThread.start();

  thirdThread.start();

  System.out.println(threadName + " end.");

  }

  }

  上面得到的结果如下:

  /**

  *

  main start...

  Thread-0 start...

  main end.

  Thread-0 end.

  Thread-1 start...

  Thread-1 end.

  Thread-2 start...

  Thread-2 end.

  */

  public class JoinMainTest {

  public static void main(String[] args) {

  String threadName = Thread.currentThread().getName();

  System.out.println(threadName + " start...");

  Thread firstThread = new Thread(new ThreadOne());

  Thread secondThread = new Thread(new ThreadTwo());

  Thread thirdThread = new Thread(new ThreadThree());

  // 2. thread run in order

  try {

  firstThread.start();

  firstThread.join();

  secondThread.start();

  secondThread.join();

  thirdThread.start();

  thirdThread.join();

  } catch (Exception ex) {

  System.out.println("thread join exception.");

  }

  System.out.println(threadName + " end.");

  }

  }

  这里得到的结果就是顺序执行的了:

  /**

  *

  main start...

  Thread-0 start...

  Thread-0 end.

  Thread-1 start...

  Thread-1 end.

  Thread-2 start...

  Thread-2 end.

  main end.

  */

  再来看一下join()的源码,join()调用的就是join(0).可以看到,其实join就是wait,直到线程执行完成。

  public final synchronized void join(long millis) throws InterruptedException {

  long base = System.currentTimeMillis();

  long now = 0;

  if (millis < 0) {

  throw new IllegalArgumentException("timeout value is negative");

  }

  if (millis == 0) {

  while (isAlive()) {

  wait(0);

  }

  } else {

  while (isAlive()) {

  long delay = millis - now;

  if (delay <= 0) {

  break;

  }

  wait(delay);

  now = System.currentTimeMillis() - base;

  }

  }

  }