• Thread中join()方法


    Thread中,join()方法的作用是调用线程等待该线程完成后,才能继续用下运行。

    public static void main(String[] args) throws InterruptedException
    {
            System.out.println("main start");
    
            Thread t1 = new Thread(new Worker("thread-1"));
            t1.start();
            t1.join();
            System.out.println("main end");
    }

    在上面的例子中,main线程要等到t1线程运行结束后,才会输出“main end”。如果不加t1.join(),main线程和t1线程是并行的。而加上t1.join(),程序就变成是顺序执行了。

    我们在用到join()的时候,通常都是main线程等到其他多个线程执行完毕后再继续执行。其他多个线程之间并不需要互相等待。

    下面这段代码并没有实现让其他线程并发执行,线程是顺序执行的。

    public static void main(String[] args) throws InterruptedException
    {
            System.out.println("main start");
    
            Thread t1 = new Thread(new Worker("thread-1"));
            Thread t2 = new Thread(new Worker("thread-2"));
            t1.start();
            //等待t1结束,这时候t2线程并未启动
            t1.join();
            
            //t1结束后,启动t2线程
            t2.start();
            //等待t2结束
            t2.join();
    
            System.out.println("main end");
    }

    为了让t1、t2线程并行,我们可以稍微改一下代码,下面给出完整的代码:

    public class JoinTest
    {
    
        public static void main(String[] args) throws InterruptedException
        {
            System.out.println("main start");
    
            Thread t1 = new Thread(new Worker("thread-1"));
            Thread t2 = new Thread(new Worker("thread-2"));
            
            t1.start();
            t2.start();
            
            t1.join();
            t2.join();
    
            System.out.println("main end");
        }
    }
    
    class Worker implements Runnable
    {
    
        private String name;
    
        public Worker(String name)
        {
            this.name = name;
        }
    
        @Override
        public void run()
        {
            for (int i = 0; i < 10; i++)
            {
                try
                {
                    Thread.sleep(1l);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
                System.out.println(name);
            }
        }
    
    }
    thread的六种状态
    线程共有6种状态;在某一时刻只能是这6种状态之一。这些状态由Thread.State这个枚举类型表示,并且可以通过getState()方法获得当前具体的状态类型。

      NEW

      至今尚未启动的线程的状态。

      当使用new一个新线程时,如new Thread(r),但还没有执行start(),线程还没有开始运行,这时线程的状态就是NEW。

     

      RUNNABLE

      可运行线程的线程状态。

      当start()方法被调用时,线程就进入RUNNABLE状态。此时的线程可能正在运行,也可能没有运行

     

      BLOCKED

      受阻塞并且正在等待监视器锁的某一线程的线程状态。

      下列情况会进入阻塞状态:

      1.等待某个操作的返回,例如IO操作,该操作返回之前,线程不会继续下面的代码。

      2.等待某个“锁”,在其他线程或程序释放这个“锁”之前,线程不会继续执行。

      3.等待一定的触发条件。

      4.线程执行了sleep方法。

      5.线程被suspend()方法挂起。

      一个被阻塞的线程在下列情况下会被重新激活:

      1.执行了sleep()方法,睡眠时间已到。

      2.等待的其他线程或程序持有的“锁”已被释放。

      3.正在等待触发条件的线程,条件得到满足。

      4.执行了suspend()方法,被调用了resume()方法。

      5.等待的操作返回的线程,操作正确返回。

     

      WAITING

      某一等待线程的线程状态。

      线程因为调用了Object.wait()或Thread.join()而未运行,就会进入WAITING状态。

     

      TIMED_WAITING

      具有指定等待时间的某一等待线程的线程状态。

      线程因为调用了Thread.sleep(),或者加上超时值来调用Object.wait()或Thread.join()而未运行,则会进入TIMED_WAITING状态。

     

      TERMINATED

      已终止线程的线程状态。

      线程已运行完毕。它的run()方法已正常结束或通过抛出异常而结束。

      线程的终止

      run()方法结束,线程就结束。

    转载:https://www.cnblogs.com/reality-soul/p/7871781.html

  • 相关阅读:
    8.10
    今日头条笔试题 1~n的每个数,按字典序排完序后,第m个数是什么?
    Gym 100500B Conference Room(最小表示法,哈希)
    CodeForces 438D The Child and Sequence(线段树)
    UVALIVE 6905 Two Yachts(最小费用最大流)
    Gym Conference Room (最小表示法,哈希)
    hdu 2389 Rain on your Parade(二分图HK算法)
    Codeforces Fox And Dinner(最大流)
    zoj 3367 Counterfeit Money(dp)
    ZOJ3370. Radio Waves(2-sat)
  • 原文地址:https://www.cnblogs.com/BluceLee/p/13846866.html
Copyright © 2020-2023  润新知