线程的生命周期

目录

目标

线程的生命周期

守护线程和用户线程的差异

区别

验证

run()和start()之间的差异

区别

验证


目标

  • 熟悉线程从创建道销毁的生命周期;
  • 理解守护线程和用户线程的差异;
  • 区分run()和start()之间的差异。

线程的生命周期

线程的生命周期


守护线程和用户线程的差异

区别

  • 守护线程做后台调度和支持性的工作,因此在框架中很常见,垃圾回收线程是最常见的守护线程;用户线程用来处理业务,所以也有人称之为业务线程;
  • 守护线程依赖用户线程存活,用户线程一旦退出,守护线程也会消亡,反之守护线程一直存在;
  • finally方法守护线程不一定会执行(取决于cup有没有正好给这个线程分配时间片);
  • 用户线程可以通过setDaemon(true)可以设置将自己设置为守护线程,该方法的参数默认为false。

验证

package com.ctx.concurrent.thread;

public class ThreadTest extends Thread {
    @Override
    public void run() {
        try{
            while(true){
                System.out.println(Thread.currentThread().getName());
            }

        }finally {
            System.out.println("finally");
        }
    }

    public static void main(String[] args) throws InterruptedException {
        //验证一:守护线程下finally方法不一定执行;
        //验证二:主线程退出后,守护线程也退出(注意此时没有业务线程)。
        ThreadTest threadTest = new ThreadTest();
        threadTest.setDaemon(true);
        threadTest.start();
        Thread.sleep(1000);
    }
}
package com.ctx.concurrent.thread;

public class ThreadTest extends Thread {
    @Override
    public void run() {
        try{
            while(true){
                System.out.println(Thread.currentThread().getName());
            }

        }finally {
            System.out.println("finally");
        }
    }

    public static void main(String[] args) throws InterruptedException {
        //验证一:业务线程存在,守护线程也存在,即使主线程退出了。
        ThreadTest threadTest = new ThreadTest();
        threadTest.setDaemon(true);
        threadTest.start();
        Thread.sleep(1000);
        ThreadTest threadTest2 = new ThreadTest();
        threadTest2.start();
    }
}

run()和start()之间的差异

区别

  • run()方法可以被多次调用,且当前线程是主线程;
  • start()方法只能被调用一次,且当前线程是线程类的本身。

验证

package com.ctx.concurrent.thread;

public class ThreadTest extends Thread {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }

    public static void main(String[] args) throws InterruptedException {
        ThreadTest threadTest = new ThreadTest();
        while(true){
            //可以被多次调用,且当前线程是主线程。
            //threadTest.run();
            //只能被调用一次,且当前线程是ThreadTest本身。
            threadTest.start();
        }
    }
}
上一篇:痞子衡嵌入式:不可不知的计算机原理知识(1)- 整数表示(原码/反码/补码)


下一篇:Java并发多线程基础总结