• 请描述线程的生命周期


    一图胜千言

     

    灵魂画家出品。

    上述的图有些简略,下面详细说明下,线程共有6种状态:

    new,runnable,blocked,waiting,timed waiting,terminated

    1,当进入synchronized同步代码块或同步方法时,且没有获取到锁,线程就进入了blocked状态,直到锁被释放,重新进入runnable状态

    2,当线程调用wait()或者join时,线程都会进入到waiting状态,当调用notify或notifyAll时,或者join的线程执行结束后,会进入runnable状态

    3,当线程调用sleep(time),或者wait(time)时,进入timed waiting状态,

    当休眠时间结束后,或者调用notify或notifyAll时会重新runnable状态。

    4,程序执行结束,线程进入terminated状态

    案例篇

    /**
     * @author huangguizhao
     * 测试线程的状态
     */
    public class ThreadStateTest {
        public static void main(String[] args) throws InterruptedException {
            Thread thread = new Thread(new Task());
            System.out.println(thread.getState());//NEW
            thread.start();
            System.out.println(thread.getState());//RUNNABLE
            //保险起见,让当前主线程休眠下
            Thread.sleep(10);
            System.out.println(thread.getState());//terminated
        }
    }
    class Task implements Runnable{
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                System.out.println(i);
            }
        }
    }
    public class ThreadStateTest {
        public static void main(String[] args) throws InterruptedException {
            BlockTask task = new BlockTask();
            Thread t1 = new Thread(task);
            Thread t2 = new Thread(task);
            t1.start();
            t2.start();
            //从严谨的角度来说,t1线程不一定会先执行,此处是假设t1先执行
            System.out.println(t1.getState());//RUNNABLE
            System.out.println(t2.getState());//BLOCKED
            Thread.sleep(10);
            System.out.println(t1.getState());//TIMED_WAITING
            Thread.sleep(1000);
            System.out.println(t1.getState());//WAITING
        }
    }
    
    class BlockTask implements Runnable{
    
        @Override
        public void run() {
            synchronized (this){
                //另一个线程会进入block状态
                try {
                    //目的是让线程进入waiting time状态
                    Thread.sleep(1000);
                    //进入waiting状态
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    注意:

    blocked,waiting,timed waiting 我们都称为阻塞状态

    上述的就绪状态和运行状态,都表现为runnable状态

  • 相关阅读:
    Linux系统操作问题汇总
    记录一些mysql数据库常用操作命令和问题汇总
    python学习之路-练习小程序02(模拟用户登录)
    python学习之路02(基础篇2)
    python学习之路-练习小程序01(猜年龄)
    python学习之路01(基础篇1)
    hashmap详解(基于jdk1.8)
    maven创建项目太慢怎么办
    CAS原理
    JUC原子类3-AtomicLongArray原子类
  • 原文地址:https://www.cnblogs.com/MJyc/p/13946974.html
Copyright © 2020-2023  润新知