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

xiaoxiao2021-02-27  295

一前言

在操作系统中线程具有优先级划分,优先级较高的线程得到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:守护线程和用户线程的区别,i sDaemon()方法如果返回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在执行thread1thread2的时候,根据时间片轮循调度,所以能够并发执行

转载请注明原文地址: https://www.6miu.com/read-5553.html

最新回复(0)