玩转java多线程学习篇五 线程的优先级和守护线程
2017-05-04 17:36
471 查看
一前言
在操作系统中线程具有优先级划分,优先级较高的线程得到CPU资源比较多,也就是CPU优先执行优先级较高的线程对象中的任务。线程优先级分为1(Thread.MIN_PRIORITY )
~ 10(Thread.MAX_PRIORITY)个等级,如果线程大于10或小于1会抛出异常throw
new IllegalArgumentException(),默认优先级 是5。
java 中有两种线程:用户线程和守护线程。可以通过isDaemon()方法来区别它们:如果返回false,则说明该线程是“用户线程”;否则就是“守护线程”。
用户线程一般用户执行用户级任务,而守护线程也就是“后台线程”,一般用来执行后台任务。需要注意的是:Java虚拟机在“用户线程”都结束后会后退出。
JDK 中关于线程优先级和守护线程的介绍如下:
1:守护线程和用户线程的区别,isDaemon()方法如果返回false则是用户线程反而是守护线程。
运行结果:
begin........
main=main,isDaemon=false
end........
threadName=thread2,isDaemon=true,i=0
threadName=thread2,isDaemon=true,i=1
threadName=thread2,isDaemon=true,i=2
threadName=thread2,isDaemon=true,i=3
threadName=thread2,isDaemon=true,i=4
threadName=thread2,isDaemon=true,i=5
threadName=thread1,isDaemon=false,i=0
threadName=thread2,isDaemon=true,i=6
threadName=thread2,isDaemon=true,i=7
threadName=thread2,isDaemon=true,i=8
threadName=thread1,isDaemon=false,i=1
threadName=thread2,isDaemon=true,i=9
threadName=thread2,isDaemon=true,i=10
threadName=thread2,isDaemon=true,i=11
threadName=thread1,isDaemon=false,i=2
threadName=thread2,isDaemon=true,i=12
threadName=thread2,isDaemon=true,i=13
threadName=thread2,isDaemon=true,i=14
threadName=thread1,isDaemon=false,i=3
threadName=thread2,isDaemon=true,i=15
threadName=thread2,isDaemon=true,i=16
threadName=thread2,isDaemon=true,i=17
threadName=thread1,isDaemon=false,i=4
threadName=thread2,isDaemon=true,i=18
threadName=thread2,isDaemon=true,i=19
threadName=thread2,isDaemon=true,i=20
threadName=thread1,isDaemon=false,i=5
threadName=thread2,isDaemon=true,i=21
threadName=thread2,isDaemon=true,i=22
threadName=thread2,isDaemon=true,i=23
threadName=thread1,isDaemon=false,i=6
threadName=thread2,isDaemon=true,i=24
threadName=thread1,isDaemon=false,i=7
threadName=thread2,isDaemon=true,i=25
threadName=thread2,isDaemon=true,i=26
threadName=thread2,isDaemon=true,i=27
threadName=thread2,isDaemon=true,i=28
threadName=thread1,isDaemon=false,i=8
threadName=thread2,isDaemon=true,i=29
threadName=thread2,isDaemon=true,i=30
threadName=thread2,isDaemon=true,i=31
threadName=thread1,isDaemon=false,i=9
结果说明:
(1) 主线程main是用户线程,它创建的子线程thread1也是用户线程。
(2)thread2是守护线程。在“主线程main”和“子线程thread1”(它们都是用户线程)执行完毕,只剩thread2这个守护线程的时候,JVM自动退出。
2:线程的优先级,怎样设置线程优先级呢?可以使用setPriority()方法。
运行结果
begin........
threadName=thread2,priority=9,i=0
threadName=thread2,priority=9,i=1
threadName=thread2,priority=9,i=2
threadName=thread2,priority=9,i=3
threadName=thread2,priority=9,i=4
threadName=thread2,priority=9,i=5
threadName=thread1,priority=2,i=0
threadName=thread2,priority=9,i=6
threadName=thread1,priority=2,i=1
threadName=thread2,priority=9,i=7
threadName=thread2,priority=9,i=8
threadName=thread1,priority=2,i=2
threadName=thread2,priority=9,i=9
threadName=thread1,priority=2,i=3
threadName=thread1,priority=2,i=4
threadName=thread1,priority=2,i=5
threadName=thread1,priority=2,i=6
threadName=thread1,priority=2,i=7
threadName=thread1,priority=2,i=8
threadName=thread1,priority=2,i=9
main=main,priority=5
end........
结果说明:
主线程main默认优先等级为5,thread1优先级为2,thread2优先级为9,但是从运行结果中可以看出,cpu在执行thread1和thread2的时候,根据时间片轮循调度,所以能够并发执行
在操作系统中线程具有优先级划分,优先级较高的线程得到CPU资源比较多,也就是CPU优先执行优先级较高的线程对象中的任务。线程优先级分为1(Thread.MIN_PRIORITY )
~ 10(Thread.MAX_PRIORITY)个等级,如果线程大于10或小于1会抛出异常throw
new IllegalArgumentException(),默认优先级 是5。
java 中有两种线程:用户线程和守护线程。可以通过isDaemon()方法来区别它们:如果返回false,则说明该线程是“用户线程”;否则就是“守护线程”。
用户线程一般用户执行用户级任务,而守护线程也就是“后台线程”,一般用来执行后台任务。需要注意的是:Java虚拟机在“用户线程”都结束后会后退出。
JDK 中关于线程优先级和守护线程的介绍如下:
每个线程都有一个优先级。“高优先级线程”会优先于“低优先级线程”执行。每个线程都可以被标记为一个守护进程或非守护进程。在一些运行的主线程中创建新的子线程时,子线程的优先级被设置为等于“创建它的主线程的优先级”,当且仅当“创建它的主线程是守护线程”时“子线程才会是守护线程”。 当Java虚拟机启动时,通常有一个单一的非守护线程(该线程通过是通过main()方法启动)。JVM会一直运行直到下面的任意一个条件发生,JVM就会终止运行: (01) 调用了exit()方法,并且exit()有权限被正常执行。 (02) 所有的“非守护线程”都死了(即JVM中仅仅只有“守护线程”)。 每一个线程都被标记为“守护线程”或“用户线程”。当只有守护线程运行时,JVM会自动退出。
1:守护线程和用户线程的区别,isDaemon()方法如果返回false则是用户线程反而是守护线程。
public class threadTest { public static void main(String[] args) { System.out.println("begin........"); MyThread myThread = new MyThread("thread1"); MyTwoThread myTwoThread = new MyTwoThread("thread2"); myTwoThread.setDaemon(true);// 设置thread2为守护线程 myThread.start(); myTwoThread.start(); System.out.println("main="+Thread.currentThread().getName()+",isDaemon="+Thread.currentThread().isDaemon()); System.out.println("end........"); } }
public class MyThread extends Thread{ public MyThread(String name) { super(name); } @Override public void run() { for (int i = 0; i < 10; i++) { try { Thread.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("threadName="+this.getName()+",isDaemon="+this.isDaemon()+",i="+i); } } }
public class MyTwoThread extends Thread{ public MyTwoThread(String name) { super(name); } @Override public void run() { for (int i = 0; i < 1000; i++) { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("threadName="+this.getName()+",isDaemon="+this.isDaemon()+",i="+i); } } }
运行结果:
begin........
main=main,isDaemon=false
end........
threadName=thread2,isDaemon=true,i=0
threadName=thread2,isDaemon=true,i=1
threadName=thread2,isDaemon=true,i=2
threadName=thread2,isDaemon=true,i=3
threadName=thread2,isDaemon=true,i=4
threadName=thread2,isDaemon=true,i=5
threadName=thread1,isDaemon=false,i=0
threadName=thread2,isDaemon=true,i=6
threadName=thread2,isDaemon=true,i=7
threadName=thread2,isDaemon=true,i=8
threadName=thread1,isDaemon=false,i=1
threadName=thread2,isDaemon=true,i=9
threadName=thread2,isDaemon=true,i=10
threadName=thread2,isDaemon=true,i=11
threadName=thread1,isDaemon=false,i=2
threadName=thread2,isDaemon=true,i=12
threadName=thread2,isDaemon=true,i=13
threadName=thread2,isDaemon=true,i=14
threadName=thread1,isDaemon=false,i=3
threadName=thread2,isDaemon=true,i=15
threadName=thread2,isDaemon=true,i=16
threadName=thread2,isDaemon=true,i=17
threadName=thread1,isDaemon=false,i=4
threadName=thread2,isDaemon=true,i=18
threadName=thread2,isDaemon=true,i=19
threadName=thread2,isDaemon=true,i=20
threadName=thread1,isDaemon=false,i=5
threadName=thread2,isDaemon=true,i=21
threadName=thread2,isDaemon=true,i=22
threadName=thread2,isDaemon=true,i=23
threadName=thread1,isDaemon=false,i=6
threadName=thread2,isDaemon=true,i=24
threadName=thread1,isDaemon=false,i=7
threadName=thread2,isDaemon=true,i=25
threadName=thread2,isDaemon=true,i=26
threadName=thread2,isDaemon=true,i=27
threadName=thread2,isDaemon=true,i=28
threadName=thread1,isDaemon=false,i=8
threadName=thread2,isDaemon=true,i=29
threadName=thread2,isDaemon=true,i=30
threadName=thread2,isDaemon=true,i=31
threadName=thread1,isDaemon=false,i=9
结果说明:
(1) 主线程main是用户线程,它创建的子线程thread1也是用户线程。
(2)thread2是守护线程。在“主线程main”和“子线程thread1”(它们都是用户线程)执行完毕,只剩thread2这个守护线程的时候,JVM自动退出。
2:线程的优先级,怎样设置线程优先级呢?可以使用setPriority()方法。
public class threadTest { public static void main(String[] args) { System.out.println("begin........"); MyThread myThread1 = new MyThread("thread1"); MyThread myThread2 = new MyThread("thread2"); myThread1.setPriority(2); myThread2.setPriority(9); myThread1.start(); myThread2.start(); try { Thread.currentThread().sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("main="+Thread.currentThread().getName()+",priority="+Thread.currentThread().getPriority()); System.out.println("end........"); } }
public class MyThread extends Thread{ public MyThread(String name) { super(name); } @Override public void run() { for (int i = 0; i < 10; i++) { try { Thread.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("threadName="+this.getName()+",priority="+this.getPriority()+",i="+i); } } }
运行结果
begin........
threadName=thread2,priority=9,i=0
threadName=thread2,priority=9,i=1
threadName=thread2,priority=9,i=2
threadName=thread2,priority=9,i=3
threadName=thread2,priority=9,i=4
threadName=thread2,priority=9,i=5
threadName=thread1,priority=2,i=0
threadName=thread2,priority=9,i=6
threadName=thread1,priority=2,i=1
threadName=thread2,priority=9,i=7
threadName=thread2,priority=9,i=8
threadName=thread1,priority=2,i=2
threadName=thread2,priority=9,i=9
threadName=thread1,priority=2,i=3
threadName=thread1,priority=2,i=4
threadName=thread1,priority=2,i=5
threadName=thread1,priority=2,i=6
threadName=thread1,priority=2,i=7
threadName=thread1,priority=2,i=8
threadName=thread1,priority=2,i=9
main=main,priority=5
end........
结果说明:
主线程main默认优先等级为5,thread1优先级为2,thread2优先级为9,但是从运行结果中可以看出,cpu在执行thread1和thread2的时候,根据时间片轮循调度,所以能够并发执行
相关文章推荐
- JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止
- java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- java多线程学习4,守护线程
- 多线程的深入学习:单生产单消费,单生产多消费,多生产多消费,守护线程,线程优先级,join和yield,线程内部匿名类
- Java多线程(十)——线程优先级和守护线程
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- Java多线程基础--10之 线程优先级和守护线程
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- 【Java 语言】Java 多线程 一 ( 线程基础 : 线程启动 | 线程停止 | 线程暂停 | 线程优先级 | 守护线程)
- java基础学习__多线程(停止线程,守护线程,join方法)
- JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止
- Java多线程系列--【基础篇10】- 线程优先级和守护线程
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- Java进阶学习2-多线程之守护线程
- Java多线程 小知识 守护线程(后台线程)setDaemon、join方法、优先级、yield方法
- Java多线程系列--“基础篇”10之 线程优先级和守护线程