zoukankan      html  css  js  c++  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;
            }
        }
    }
  • 相关阅读:
    as
    留言板
    HEOI2020游记
    min_25筛学习笔记
    计算几何初步
    「狗屁不会」exlucas
    GCD of Sequence
    做题记录
    一些奇怪的坑+好东西
    关于我
  • 原文地址:https://www.cnblogs.com/treerain/p/java_thread_join.html
Copyright © 2011-2022 走看看