• 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;
            }
        }
    }
  • 相关阅读:
    Django-配置Mysql
    Django-manage.py shell命令
    Codeforces 1516B AGAGA XOOORRR
    sitemesh入门教程
    养生好习惯
    解决idea自动导入类String总是导入sun.org.apache.xpath.internal.operations包下的String
    [C#]浅谈协变与逆变
    [C#]跨模块的可选参数与常量注意事项
    [C#]LockBits使用笔记
    1.在校研究生申请软件著作权(学校为第一著作人)
  • 原文地址:https://www.cnblogs.com/treerain/p/java_thread_join.html
Copyright © 2020-2023  润新知