@@ -159,6 +159,41 @@ Thread类继承了Runnable接口,调用start()方法会启动一个新的线
159159![ ] ( img/thread-states.png )
160160
161161### 线程的优先级与守护线程
162+ > 线程的优先级
163+ Java中的线程优先级的范围是1~10,默认的优先级是5,10极最高。线程的优先级具有以下特性:
164+ ` 概率性 ` : “高优先级线程”被分配CPU的概率高于“低优先级线程”
165+ `随机性`: 根据时间片轮循调度,能够并发执行,无论是是级别相同还是不同,线程调用都不会绝对按照优先级执行,每次执行结果都不一样,调度算法无规律可循,所以线程之间不能有先后依赖关系。无时间片轮循机制时,高级别的线程优先执行,如果低级别的线程正在运行时,有高级别线程可运行状态,则会执行完低级别线程,再去执行高级别线程。如果低级别线程处于等待、睡眠、阻塞状态,或者调用yield()函数让当前运行线程回到可运行状态,以允许具有相同优先级或者高级别的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。
166+ > 用户线程与守护线程
167+ 在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)
168+ 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆。只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 ` GC (垃圾回收器) ` ,它就是一个很称职的守护者。User和Daemon两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Thread存在了,虚拟机也就退出了。 因为没有了被守护者,Daemon也就没有工作可做了,也就没有继续运行程序的必要了。
169+ 值得一提的是,守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程。下面的方法就是用来设置守护线程的。
170+ ``` java
171+ // 设定 daemonThread 为 守护线程,default false(非守护线程)
172+ daemonThread. setDaemon(true );
173+
174+ // 验证当前线程是否为守护线程,返回 true 则为守护线程
175+ daemonThread. isDaemon();
176+ ```
177+ 这里有几点需要注意:
178+ 1 . thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
179+ 2 . 在Daemon线程中产生的新线程也是Daemon的。
180+ 3 . 不要认为所有的应用都可以分配给Daemon来进行服务,比如读写操作或者计算逻辑。
181+
182+ * 那么守护线程的作用是什么?*
183+ 举例, GC垃圾回收线程:就是一个经典的守护线程,当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线程会自动离开。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。
184+ 应用场景:(1)来为其它线程提供服务支持的情况;(2) 或者在任何情况下,程序结束时,这个线程必须正常且立刻关闭,就可以作为守护线程来使用;反之,如果一个正在执行某个操作的线程必须要正确地关闭掉否则就会出现不好的后果的话,那么这个线程就不能是守护线程,而是用户线程。通常都是些关键的事务,比方说,数据库录入或者更新,这些操作都是不能中断的。
185+ JVM 程序在什么情况下能够正常退出?
186+ The Java Virtual Machine exits when the only threads running are all daemon threads.
187+ 上面这句话来自 JDK 官方文档,意思是:如果 JVM 中没有一个正在运行的非守护线程,这个时候,JVM 会退出。换句话说,守护线程拥有自动结束自己生命周期的特性,而非守护线程不具备这个特点
188+
189+
162190### 线程的基本操作
163191### synchronized关键字
164192### 生产者消费者问题
193+
194+ https://www.cnblogs.com/skywang12345/
195+ https://www.cnblogs.com/walixiansheng/p/9588603.html
196+ https://segmentfault.com/u/niteip/articles?sort=vote
197+ https://www.cnblogs.com/qq1290511257/p/10645106.html
198+ https://www.cnblogs.com/developer_chan/p/10391365.html
199+ Java多线程中的钩子线程https://www.exception.site/java-concurrency/java-concurrency-hook-thread
0 commit comments