zoukankan      html  css  js  c++  java
  • 请描述线程的生命周期

    一图胜千言

     

    灵魂画家出品。

    上述的图有些简略,下面详细说明下,线程共有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状态

  • 相关阅读:
    TCP的发送缓冲区和接收缓冲区
    【 Linux 】单台服务器上并发TCP连接数(转)
    Mosquitto----服务器日志
    Mqtt ----心跳机制
    class文件无论是32位还是64位jdk编译出来的,都可以通用
    启动eclipse时出现“Failed to load the JNI shared library jvm.dll”错误及解决-及eclipse版本查看
    Ant编译提示“Unsupported major.minor version 52.0”
    HanLP自然语言处理包介绍
    Lazarus安装使用
    Java中字符串转为16进制表示
  • 原文地址:https://www.cnblogs.com/MJyc/p/13946974.html
Copyright © 2011-2022 走看看