玩转java多线程学习篇五 线程的优先级和守护线程

来源:互联网 发布:musical软件 编辑:程序博客网 时间:2024/06/06 14:19

前言

在操作系统中线程具有优先级划分,优先级较高的线程得到CPU资源比较多,也就是CPU优先执行优先级较高的线程对象中的任务。线程优先级分为1Thread.MIN_PRIORITY ) ~ 10Thread.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);}@Overridepublic 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);}@Overridepublic 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);}@Overridepublic 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在执行thread1thread2的时候,根据时间片轮循调度,所以能够并发执行




1 0
原创粉丝点击