Java多线程系列--“基础篇”10之 线程优先级和守护线程
来源:互联网 发布:蹭网器淘宝叫什么 编辑:程序博客网 时间:2024/06/05 06:58
概要
本章,会对守护线程和线程优先级进行介绍。涉及到的内容包括:
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. 线程优先级的示例
我们先看看优先级的示例
1 class MyThread extends Thread{ 2 public MyThread(String name) { 3 super(name); 4 } 5 6 public void run(){ 7 for (int i=0; i<5; i++) { 8 System.out.println(Thread.currentThread().getName() 9 +"("+Thread.currentThread().getPriority()+ ")"10 +", loop "+i);11 }12 } 13 }; 14 15 public class Demo { 16 public static void main(String[] args) { 17 18 System.out.println(Thread.currentThread().getName()19 +"("+Thread.currentThread().getPriority()+ ")");20 21 Thread t1=new MyThread("t1"); // 新建t122 Thread t2=new MyThread("t2"); // 新建t223 t1.setPriority(1); // 设置t1的优先级为124 t2.setPriority(10); // 设置t2的优先级为1025 t1.start(); // 启动t126 t2.start(); // 启动t227 } 28 }
运行结果:
main(5)t1(1), loop 0t2(10), loop 0t1(1), loop 1t2(10), loop 1t1(1), loop 2t2(10), loop 2t1(1), loop 3t2(10), loop 3t1(1), loop 4t2(10), loop 4
结果说明:
(01) 主线程main的优先级是5。
(02) t1的优先级被设为1,而t2的优先级被设为10。cpu在执行t1和t2的时候,根据时间片轮循调度,所以能够并发执行。
3. 守护线程的示例
下面是守护线程的示例。
1 // Demo.java 2 class MyThread extends Thread{ 3 public MyThread(String name) { 4 super(name); 5 } 6 7 public void run(){ 8 try { 9 for (int i=0; i<5; i++) {10 Thread.sleep(3);11 System.out.println(this.getName() +"(isDaemon="+this.isDaemon()+ ")" +", loop "+i);12 }13 } catch (InterruptedException e) {14 }15 } 16 }; 17 18 class MyDaemon extends Thread{ 19 public MyDaemon(String name) {20 super(name);21 }22 23 public void run(){24 try {25 for (int i=0; i<10000; i++) {26 Thread.sleep(1);27 System.out.println(this.getName() +"(isDaemon="+this.isDaemon()+ ")" +", loop "+i);28 }29 } catch (InterruptedException e) {30 }31 } 32 }33 public class Demo { 34 public static void main(String[] args) { 35 36 System.out.println(Thread.currentThread().getName()37 +"(isDaemon="+Thread.currentThread().isDaemon()+ ")");38 39 Thread t1=new MyThread("t1"); // 新建t140 Thread t2=new MyDaemon("t2"); // 新建t241 t2.setDaemon(true); // 设置t2为守护线程42 t1.start(); // 启动t143 t2.start(); // 启动t244 } 45 }
运行结果:
main(isDaemon=false)t2(isDaemon=true), loop 0t2(isDaemon=true), loop 1t1(isDaemon=false), loop 0t2(isDaemon=true), loop 2t2(isDaemon=true), loop 3t1(isDaemon=false), loop 1t2(isDaemon=true), loop 4t2(isDaemon=true), loop 5t2(isDaemon=true), loop 6t1(isDaemon=false), loop 2t2(isDaemon=true), loop 7t2(isDaemon=true), loop 8t2(isDaemon=true), loop 9t1(isDaemon=false), loop 3t2(isDaemon=true), loop 10t2(isDaemon=true), loop 11t1(isDaemon=false), loop 4t2(isDaemon=true), loop 12
结果说明:
(01) 主线程main是用户线程,它创建的子线程t1也是用户线程。
(02) t2是守护线程。在“主线程main”和“子线程t1”(它们都是用户线程)执行完毕,只剩t2这个守护线程的时候,JVM自动退出。
更多内容
00. Java多线程目录(共xx篇)
01. Java多线程系列--“基础篇”01之 基本概念
02. Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
03. Java多线程系列--“基础篇”03之 Thread中start()和run()的区别
04. Java多线程系列--“基础篇”04之 synchronized关键字
05. Java多线程系列--“基础篇”05之 线程等待与唤醒
06. Java多线程系列--“基础篇”06之 线程让步
07. Java多线程系列--“基础篇”07之 线程休眠
08. Java多线程系列--“基础篇”08之 join()
09. Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- Java多线程系列--“基础篇”10之 线程优先级和守护线程 (r)
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- Java多线程基础--10之 线程优先级和守护线程
- Java多线程系列--【基础篇10】- 线程优先级和守护线程
- ava多线程系列-- 之 线程优先级和守护线程
- Java多线程系列(8)--线程优先级和守护线程(后台线程)
- 玩转java多线程学习篇五 线程的优先级和守护线程
- java多线程之守护线程
- java多线程之守护线程和用户线程
- JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止
- java基础之守护线程
- Java多线程系列2(守护线程)
- java 多线程守护线程和非守护线程
- Java 多线程:守护线程和非守护线程
- 通过查看端口状态查看mongodb是否已经启动
- 原生JS实现AJAX及其原理
- 宏,枚举,常量的区别
- 渗透日记2:通过cmd上传文件的方法-vbs脚本
- Android自定义View数字圆环(一)
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- ofbiz学习——对模板使用装饰器screen widget
- 项目中下载的图片本地系统相册无法显示
- Codeforces Round #436 (Div. 2)解题报告
- httpd
- 蓝牙核心技术概述(二):蓝牙使用场景
- Android ViewPager一次性加载全部页卡,并且滑动时不被销毁
- HDU1009
- Session共享问题