线程的生命周期

目录

目标

线程的生命周期

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

区别

验证

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值