Java多线程系列--“基础篇”10之 线程优先级和守护线程
概要
本章,会对守护线程和线程优先级进行介绍。涉及到的内容包括:
1. 线程优先级的介绍
2. 线程优先级的示例
3. 守护线程的示例
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3479982.html
1. 线程优先级的介绍
java 中的线程优先级的范围是1~10,默认的优先级是5。“高优先级线程”会优先于“低优先级线程”执行。
java 中有两种线程:用户线程和守护线程。可以通过isDaemon()方法来区别它们:如果返回false,则说明该线程是“用户线程”;否则就是“守护线程”。
用户线程一般用户执行用户级任务,而守护线程也就是“后台线程”,一般用来执行后台任务。需要注意的是:Java虚拟机在“用户线程”都结束后会后退出。
JDK 中关于线程优先级和守护线程的介绍如下:
- Every thread has a priority. Threads with higher priority are executed in preference to threads with lower priority. Each thread may or may not also be marked as a daemon. When code running in some thread creates a new Thread object, the new thread has its priority initially set equal to the priority of the creating thread, and is a daemon thread if and only if the creating thread is a daemon.
- When a Java Virtual Machine starts up, there is usually a single non-daemon thread (which typically calls the method named main of some designated class). The Java Virtual Machine continues to execute threads until either of the following occurs:
- The exit method of class Runtime has been called and the security manager has permitted the exit operation to take place.
- All threads that are not daemon threads have died, either by returning from the call to the run method or by throwing an exception that propagates beyond the run method.
- Marks this thread as either a daemon thread or a user thread. The Java Virtual Machine exits when the only threads running are all daemon threads.
大致意思是:
- 每个线程都有一个优先级。“高优先级线程”会优先于“低优先级线程”执行。每个线程都可以被标记为一个守护进程或非守护进程。在一些运行的主线程中创建新的子线程时,子线程的优先级被设置为等于“创建它的主线程的优先级”,当且仅当“创建它的主线程是守护线程”时“子线程才会是守护线程”。
- 当Java虚拟机启动时,通常有一个单一的非守护线程(该线程通过是通过main()方法启动)。JVM会一直运行直到下面的任意一个条件发生,JVM就会终止运行:
- (01) 调用了exit()方法,并且exit()有权限被正常执行。
- (02) 所有的“非守护线程”都死了(即JVM中仅仅只有“守护线程”)。
- 每一个线程都被标记为“守护线程”或“用户线程”。当只有守护线程运行时,JVM会自动退出。
2. 线程优先级的示例
我们先看看优先级的示例
- class MyThread extends Thread{
- public MyThread(String name) {
- super(name);
- }
- public void run(){
- for (int i=0; i<5; i++) {
- System.out.println(Thread.currentThread().getName()
- +"("+Thread.currentThread().getPriority()+ ")"
- +", loop "+i);
- }
- }
- };
- public class Demo {
- public static void main(String[] args) {
- System.out.println(Thread.currentThread().getName()
- +"("+Thread.currentThread().getPriority()+ ")");
- Thread t1=new MyThread("t1"); // 新建t1
- Thread t2=new MyThread("t2"); // 新建t2
- t1.setPriority(1); // 设置t1的优先级为1
- t2.setPriority(10); // 设置t2的优先级为10
- t1.start(); // 启动t1
- t2.start(); // 启动t2
- }
- }
运行结果:
- main(5)
- t1(1), loop 0
- t2(10), loop 0
- t1(1), loop 1
- t2(10), loop 1
- t1(1), loop 2
- t2(10), loop 2
- t1(1), loop 3
- t2(10), loop 3
- t1(1), loop 4
- t2(10), loop 4
结果说明:
(01) 主线程main的优先级是5。
(02) t1的优先级被设为1,而t2的优先级被设为10。cpu在执行t1和t2的时候,根据时间片轮循调度,所以能够并发执行。
3. 守护线程的示例
下面是守护线程的示例。
- // Demo.java
- class MyThread extends Thread{
- public MyThread(String name) {
- super(name);
- }
- public void run(){
- try {
- for (int i=0; i<5; i++) {
- Thread.sleep(3);
- System.out.println(this.getName() +"(isDaemon="+this.isDaemon()+ ")" +", loop "+i);
- }
- } catch (InterruptedException e) {
- }
- }
- };
- class MyDaemon extends Thread{
- public MyDaemon(String name) {
- super(name);
- }
- public void run(){
- try {
- for (int i=0; i<10000; i++) {
- Thread.sleep(1);
- System.out.println(this.getName() +"(isDaemon="+this.isDaemon()+ ")" +", loop "+i);
- }
- } catch (InterruptedException e) {
- }
- }
- }
- public class Demo {
- public static void main(String[] args) {
- System.out.println(Thread.currentThread().getName()
- +"(isDaemon="+Thread.currentThread().isDaemon()+ ")");
- Thread t1=new MyThread("t1"); // 新建t1
- Thread t2=new MyDaemon("t2"); // 新建t2
- t2.setDaemon(true); // 设置t2为守护线程
- t1.start(); // 启动t1
- t2.start(); // 启动t2
- }
- }
运行结果:
- main(isDaemon=false)
- t2(isDaemon=true), loop 0
- t2(isDaemon=true), loop 1
- t1(isDaemon=false), loop 0
- t2(isDaemon=true), loop 2
- t2(isDaemon=true), loop 3
- t1(isDaemon=false), loop 1
- t2(isDaemon=true), loop 4
- t2(isDaemon=true), loop 5
- t2(isDaemon=true), loop 6
- t1(isDaemon=false), loop 2
- t2(isDaemon=true), loop 7
- t2(isDaemon=true), loop 8
- t2(isDaemon=true), loop 9
- t1(isDaemon=false), loop 3
- t2(isDaemon=true), loop 10
- t2(isDaemon=true), loop 11
- t1(isDaemon=false), loop 4
- t2(isDaemon=true), loop 12
结果说明:
(01) 主线程main是用户线程,它创建的子线程t1也是用户线程。
(02) t2是守护线程。在“主线程main”和“子线程t1”(它们都是用户线程)执行完毕,只剩t2这个守护线程的时候,JVM自动退出。
更多内容
00. Java多线程目录(共xx篇)
02. Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
03. Java多线程系列--“基础篇”03之 Thread中start()和run()的区别
04. Java多线程系列--“基础篇”04之 synchronized关键字
05. Java多线程系列--“基础篇”05之 线程等待与唤醒
08. Java多线程系列--“基础篇”08之 join()
09. Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
Java多线程系列--“基础篇”10之 线程优先级和守护线程的更多相关文章
- java 多线程系列基础篇(九)之interrupt()和线程终止方式
1. interrupt()说明 在介绍终止线程的方式之前,有必要先对interrupt()进行了解.关于interrupt(),java的djk文档描述如下:http://docs.oracle.c ...
- Java多线程系列 基础篇10 wait/notify/sleep/yield/join
1.Object类中的wait()/notify()/notifyAll() wait(): 让当前线程处于Waiting状态并释放掉持有的对象锁,直到其他线程调用此对象的线程notify()/not ...
- Java多线程系列--“基础篇”11之 生产消费者问题
概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...
- Java多线程系列--“基础篇”06之 线程让步
概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...
- Java多线程系列--“基础篇”07之 线程休眠
概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...
- Java多线程系列--“基础篇”05之 线程等待与唤醒
概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...
- Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于“阻塞状态”的线程2.2 终止处于“运行状态” ...
- Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
概要 本章,我们学习“常用的实现多线程的2种方式”:Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程.关于线程 ...
- Java多线程系列--“基础篇”04之 synchronized关键字
概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...
随机推荐
- Bookstore project using XAMPP 详细配置 Part 2
2. Implementation of MySQL database in “phpMyAdmin” 1) Create database named “tbl_book” 2) I changed ...
- 项目修改有感_主要是以js、Gridview为主
1.弹出提示:confirm--弹出的窗口有确认.取消按钮 alert--弹出的窗口只有确认按钮 例:若需要在点击确认后执行其他操作(confirm) var toAlert = confirm(&q ...
- C#中Directory.GetFiles() 函数的使用
C#中Directory.GetFiles(string path , string searchPattern, SearchOption searchOption ) 获取path目录中所有文件 ...
- Linux 下比较文件内容并相同部分、不同部分
说明,是通过file2内容与file1做比较,最后列出file1与file2不同的部分! 一.准备两个文件: [root@kinggoo.com test1]# cat file1 a b c d e ...
- 如何获得DataGrid中某行某列的对象
假如某行是 Xm_struct x = this.Brow.SelectedItem as Xm_struct;则下面分别是第5和第七列的对象 TextBlock Ddjs = this.Brow.C ...
- Dom4j 对XMl解析 新手学习,欢迎高手指正
废话不多,先看代码 public static void main(String args[]){ ReaderXml("d:/example.xml");//读取XML,传入XM ...
- EBS excel模板xml publisher开发
前提: BI publisher下载地址: http://www.oracle.com/technetwork/middleware/bi-publisher/downloads/index.html ...
- mysql客户端导入sql文件命令
mysql -h localhost -u root -p dbname < filename
- 分享:用 NDK C++做底层开发的Android 浏览器,纯免费,无广告
分享:用 NDK C++做底层开发的Android 浏览器,纯免费,无广告 操作简单,傻瓜一看就会 无毒.无广告.无负作用,完全免费 下载地址1:http://awdjcfeizb.l33.yunpa ...
- nodejs安装/运行脚本
本文主要介绍nodejs在windows下安装及运行脚本. 安装nodejs 先从nodejs官网:http://nodejs.org/下载对应的系统的安装包,比如用于64位系统的最新0.10.21的 ...