您的位置:首页 > 编程语言 > Java开发

玩转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 中关于线程优先级和守护线程的介绍如下:

每个线程都有一个优先级。“高优先级线程”会优先于“低优先级线程”执行。每个线程都可以被标记为一个守护进程或非守护进程。在一些运行的主线程中创建新的子线程时,子线程的优先级被设置为等于“创建它的主线程的优先级”,当且仅当“创建它的主线程是守护线程”时“子线程才会是守护线程”。

当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的时候,根据时间片轮循调度,所以能够并发执行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐