zoukankan      html  css  js  c++  java
  • 线程的生命周期和控制

    一、线程的生命周期

      进程与线程一样,都具有一定的生命周期,线程的生命周期包括四个状态:创建状态、就绪状态、阻塞状态、死亡状态。

      1.创建状态

        1)是指使用new实例化一个线程对象,但该线程对象还未使用start()方法启动线程这个阶段,该阶段只在内存的堆中为该对象的实例变量分配了内存空间,但线程还无法参与抢夺CPU的使用权;

        2)创建完毕线程对象后,启动该线程对象的是start()方法,而不是run()方法。

      2.就绪状态

        1)是指一个线程对象使用start()方法后到运行完run()方法的这个阶段,线程一旦就进入就绪阶段,Java虚拟机为该线程创建方法的调用栈和计数器等;

        2)在某一单位时间(时间片)内,CPU只能运行一个线程,一但一个线程拥有了CPU的使用权,则该线程也可称为正在运行状态;

        3)凡是处于就绪状态的线程都被视为活动的,可以使用isAlive()方法测试线程是否处于就绪状态,使用activeCount()查询当前线程所在线程池的活动线程数;

        4)处于就绪状态的线程并不是运行状态,在以前的计算机很多都是单处理器的,要在同一时刻运行所有处于就绪状态的线程是不可能的,Java通过一些调度算法来保证这些线程共享使用处理器(如时间片轮转算法、独占算法等)。

      3.阻塞状态:

        1)阻塞状态包含四种状态(睡眠状态、阻塞状态、挂起状态、等待状态),一般来说,阻塞状态和就绪状态可以相互切换的;

        2)使用sleep()方法可以线程进入睡眠状态,让其他进程得到运行机会,但是用sleep方法必须捕获InterruptedExecption异常;

        3)使用suspend方法可以挂起线程(jdk1.2后已过时)、使用wait方法使线程进入等待状态(后面有一随笔会专门写)、使用I/O中断让线程进入阻塞状态。

      4.死亡状态:

        1)一旦线程运行完run方法,线程即进入死亡状态,Java虚拟机会销毁处于死亡状态的线程对象所占用的系统资源;

        2)线程执行时遇到一个未捕获的异常,线程会被终止并进入死亡状态;调用stop方法也可以让线程进入死亡状态,但是容易造成死锁,已弃用。

      5.线程生命周期如下图:

    二、下面是sleep方法使线程进入睡眠状态的案例

    /**
     * @author: PrincessHug
     * @date: 2019/4/12, 9:20
     * @Blog: https://www.cnblogs.com/HelloBigTable/
     */
    public class SleepDemo  implements Runnable{
        @Override
        public void run() {
            long l;
            for (int i=1;i<6;i++){
                l = System.currentTimeMillis();
                try {
                    Thread.currentThread().sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                l = (System.currentTimeMillis() - l);
                System.out.println(Thread.currentThread().getName() + "线程执行了" + i + "次,耗时" + l + "毫秒。");
            }
        }
    }
    public class SleepDriver { public static void main(String[] args) { SleepDemo sd = new SleepDemo(); for (int i=0;i<50;i++){ new Thread(sd,i + "#").start(); } } }

      下面是部分运行结果截图:

    可以看到如果同时启动的线程越多,会导致每个线程的耗时越长。

  • 相关阅读:
    poj1511
    poj2996
    poj1062
    poj3259
    poj2993
    手动上传SNAPSHOT文件到Maven私服Nexus的方法
    安全可靠国产系统下的应用怎么搭建?
    手动上传SNAPSHOT文件到Maven私服Nexus的方法
    Maven 初学+http://mvnrepository.com/
    IDEA中Maven依赖下载失败解决方案
  • 原文地址:https://www.cnblogs.com/HelloBigTable/p/10699101.html
Copyright © 2011-2022 走看看