【JavaEE初阶 — 多线程】Thread类的属性

打印 上一主题 下一主题

主题 676|帖子 676|积分 2028





目次
Thread类的属性
1.Thread 的常见构造方法
2.Thread 的几个常见属性
2.1 前台线程与后台线程
2.2  setDaemon()
2.3 isAlive()


Thread类的属性




  • Thread 类是JVM 用来管理线程的一个类,换句话说,每个线程都有一个唯一的Thread 对象与之关联;
  • 每个实验流,也需要有一个对象来描述;
  • Thread类的对象就是用来描述一个线程实验流的,JVM会将这些Thread对象构造起来,用于线程调度,线程管理。


1.Thread 的常见构造方法


方法阐明
Thread()
 
创建线程对象,必须要重写 Thread类 的 run()方法
 
Thread(Runnable target) 利用 Runnable 对象创建线程对象

【不消重写 Thread类 的 run()方法】
Thread(String name)
创建线程对象,并命名
 
Thread(Runnable target,String name) 利用 Runnable对象创建线程对象,并命名

    Thread(ThreadGroup group, Runnable target)
线程可以被用来分组管理,分好的组即为线程组
【这个目前我们相识即可】

对于 Thread类 的第四种构造方法,第一个参数传的是lamda表达式,lamda相当于Rannable;
再传入的第二个参数,就是这个线程的名字,需要手动添加 “  ” 

假如要调用:带有 自界说线程名字 的参数 的 构造方法,无论自界说的名字是什么,都不会不影响线程的实验的;为了方便步伐员调试,可以给线程起名字。

步伐运行后,我们可以通过 jconsole 这个工具,在线程列表中,看到自界说名字,并且正在运行的线程。除了自界说的线程,线程列表中的线程是JVM提供的线程。


假如我们不界说名字,步伐调用 Thread类 的第一个构造方法,在jconsole的线程列表中,我们可以发现,假如不自界说线程名,系统会利用默认线程名 Thread - 数字 来命名线程。

假如在一个历程中有多个线程,这些线程,会被CPU随机调度,并发实验;
所以不愿定会由于主线程结束,整个历程也跟着结束。

2.Thread 的几个常见属性



属性
 
获取方法
 
ID
【线程的唯一标识,不同线程不会重复】
getId()
 
名称
【各种调试工具都会用到】
getName()
 
状态
【表示线程当前所处的一个情况】
getState()
 
优先级
【优先级高的线程理论上来说更轻易被调度到】
getPriority()
 
是否后台线程
【JVM会在一个历程的全部非后台线程结束后,才会结束运行】
isDaemon()
 
是否存活
【简单的明白为,run() 是否运行结束了】
isAlive()
 
是否被中断
 
isInterrupted()

2.1 前台线程与后台线程



假如在步伐运行的过程中,我们通过 jconsole 查看线程列表中没有main,阐明主线程已经结束;
主线程结束,但是 t1,t2,t3 还在,利用历程还在;阐明 t1,t2,t3 可以或许影响历程是否终止。
全部类似 t1,t2,t3 如许可以或许有效历程存在的线程,称为 “前台线程”。
步伐员通过代码创建的线程 和 主线程,都默认是前台线程。

总结:

  • 能影响历程存在的,是前台线程;不能影响历程存在的,是后台线程;
  • JVM会在一个历程的全部非后台线程结束后,才会结束运行

2.2  setDaemon()


步伐员通过编写代码,创建的线程,包罗main主线程,默认都是前台线程;
但是可以通过setDaemon(),将  前台线程 修改成 后台线程~~ 

上述代码的逻辑:主线程和 t 线程并发实验,并且主线程在打印三次“ hello main ”后,打印结束日记,而 t 线程继续实验死循环,所以历程没有由于主线程终止而结束。
所以,t 线程是一个前台线程,我们可以通过 isDeamon() 将 t 设置成后台线程;

通过 t.isDaemon(true) ,把 t 线程 从前台线程设置成后台线程;
此时,代码中只有主线程一个前台线程,所以在主线程运行结束后,整个历程结束,t 线程的死循环也被迫结束。

   拓展:
  历程与历程之间存在父子关系,而线程与线程之间则不存在;比如:
  IDEA 本身也是一个 Java 历程;在 IDEA 中运行一个 Java  代码,通过IDEA 历程,又创建出一个新的Java 历程,这俩历程之间就是父子关系。
  
 2.3 isAlive()


Java 代码中创建的Thread对象,和系统中的线程,是一 一对应的关系;
但是,Thread 对象 的生命周期,和 系统中的线程 的生命周期,是不同的~~
(大概存在:Thread对象 还存活,但是 系统中的线程 已经销毁 的情况) 
我们引入一段代码,来看看"Thread对象还存活,但是系统中的线程已经销毁的情况"这种情况:

这个代码的逻辑:
前三秒 sleep1000毫秒 t线程的状态都是alive的状态,三秒后实验结束,t线程的isalive状态为false

线程的入口方法里的逻辑结束了,系统中对应的线程也就随之销毁了(利用系统) ;
虽然系统中的线程已经销毁,但是 Thread对象 还存活;
因此,t线程 被销毁,但是 t 这个对象仍旧存在,所以才华不停通过t对象,调用isAlive方法

再多实验几次上述代码,发现步伐运行结果中的 true 的个数是 3 照旧 4 不固定,这是线程随机调度造成的: 

主线程第四次打印,和 t线程 的结束,谁先谁后,是不愿定的;
假如打印 true 的次数为4,阐明在 第四次 主线程 和 t线程 并发实验的次序是:

  • 先实验主线程中的打印 t.isAlive
  • 然后才实验 t线程 中的循环判断是否结束
所以 打印的第一个 false 是第五次实验线程,此时 t 线程已经凉透了~~






免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

络腮胡菲菲

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表