java守护线程和普通线程的区别,用户线程和守护线程有什么区别

  java守护线程和普通线程的区别,用户线程和守护线程有什么区别

  00-1010守护程序线程的定义创建守护程序线程将线程池设置为守护程序线程与用户线程用户线程守护程序线程注意事项摘要前言:

  用户线程和守护线程。默认情况下,我们创建的线程或者线程池都是用户线程,所以用户线程也叫普通线程。

  如果要检查一个线程是用户线程还是守护线程,可以通过Thread.isDaemon()方法来判断。如果返回的结果为真,则为守护线程,否则为用户线程。

  在 Java 语言中,线程分为两类:

  导入Java . util . concurrent . linkedblockingqueue;导入Java . util . concurrent . threadpoolexecutor;导入Java . util . concurrent . time unit;/* * *线程类型:守护线程或用户线程*/公共类线程类型{ public static void main(string[]args){//create Thread Thread=new Thread(new runnable(){ @ override public void run(){//.}});//创建线程池thread pool执行器threadpool=new threadpool执行器(10,10,0,timeunit.seconds,new linkedblockingqueue(100));thread pool . submit(new runnable(){ @ override public void run(){ system . out . println( thread pool线程类型:(thread.currentthread()。isdemon ()==真?守护线程 3360 用户线程))));} });System.out.println(Thread线程类型:(thread.isDaemon()==true?守护线程 3360 用户线程))));System.out.println(主线程类型:(thread.currentthread()。isdemon ()==真?守护线程 3360 用户线程))));} }我们来测试一下默认情况下线程和线程池属于哪种线程类型?测试代码如下:

  从上面的结果可以看出,默认创建的线程和线程池都是用户线程。

  00-1010以上程序的执行结果如下图所示:s守护线程的角色就像“服务员”,而用户线程的角色就像“客户”。当所有的客户都走了(所有的执行都结束了)的时候,waiter(守护线程)就没有任何意义了,所以当一个程序中所有的用户线程都执行完的时候,不管守护线程是否还在工作,整个程序都会随着用户线程而结束。

  

目录

守护线程(Daemon Thread)也被称之为后台线程或服务线程,守护线程是为用户线程服务的,当程序中的用户线程全部执行结束之后,守护线程也会跟随结束。

 

  public static void main(String[]args){ Thread Thread=new Thread(new Runnable(){ @ Override public void run(){//.} });//将线程设置为daemon thread . Set daemon(true);System.out.println(Thread线程类型:

   (thread.isDaemon() == true ? "守护线程" : "用户线程")); System.out.println("main 线程类型:" + (Thread.currentThread().isDaemon() == true ? "守护线程" : "用户线程"));}以上程序的执行结果如下图所示:

  

 

  

 

  

将线程池设置为守护线程

要把线程池设置为守护线程相对来说麻烦一些,需要将线程池中的所有线程都设置成守护线程,这个时候就需要使用线程工厂 ThreadFactory 来设置了(线程池中的所有线程都是通过线程工厂创建的),

 

  它的具体实现代码如下:

  

public static void main(String[] args) throws InterruptedException { // 线程工厂(设置守护线程) ThreadFactory threadFactory = new ThreadFactory() { @Override public Thread newThread(Runnable r) { Thread thread = new Thread(r); // 设置为守护线程 thread.setDaemon(true); return thread; } }; // 创建线程池 ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 10, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100), threadFactory); threadPool.submit(new Runnable() { @Override public void run() { System.out.println("ThreadPool 线程类型:" + (Thread.currentThread().isDaemon() == true ? "守护线程" : "用户线程")); } }); Thread.sleep(2000);}

以上程序的执行结果如下图所示:

 

  

 

  

 

  

守护线程 VS 用户线程

通过前面的内容我们了解了什么是用户线程和守护线程了,那二者有什么区别呢?接下来我们用一个小示例来观察一下。 接下来我们将创建一个线程,分别将这个线程设置为用户线程和守护线程,在每个线程中执行一个 for 循环,总共执行 10 次信息打印,每次打印之后休眠 100 毫秒,来观察程序的运行结果。

 

  

 

  

用户线程

新建的线程默认就是用户线程,因此我们无需对线程进行任何特殊的处理,执行 for 循环即可(总共执行 10 次信息打印,每次打印之后休眠 100 毫秒),

 

  实现代码如下:

  

public static void main(String[] args) throws InterruptedException { // 创建用户线程 Thread thread = new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 10; i++) { // 打印 i 信息 System.out.println("i:" + i); try { // 休眠 100 毫秒 Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }); // 启动线程 thread.start();}

以上程序的执行结果如下图所示:

 

  

 

  从上述结果可以看出,当程序执行完 10 次打印之后才会正常结束进程。

  

 

  

守护线程

public static void main(String[] args) throws InterruptedException { // 创建守护线程 Thread thread = new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 10; i++) { // 打印 i 信息 System.out.println("i:" + i); try { // 休眠 100 毫秒 Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }); // 设置为守护线程 thread.setDaemon(true); // 启动线程 thread.start();}

以上程序执行结果如下图所示:

 

  

 

  从上述结果可以看出,当线程设置为守护线程之后,整个程序不会等守护线程 for 循环 10 次之后再进行关闭,而是当主线程结束之后,守护线程一次循环都没执行就结束了,由此可以看出守护线程和用户线程的不同。

  

 

  

守护线程注意事项

守护线程的设置 setDaemon(true) 必须要放在线程的 start() 之前,否则程序会报错。也就是说在运行线程之前,一定要先确定线程的类型,并且线程运行之后是不允许修改线程的类型的。 接下来我们来演示一下,如果在程序运行执行再设置线程的类型会出现什么问题?

 

  演示代码如下:

  

public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 10; i++) { // 打印 i 信息 System.out.println("i:" + i + ",isDaemon:" + Thread.currentThread().isDaemon()); try { // 休眠 100 毫秒 Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }); // 启动线程 thread.start(); // 设置为守护线程 thread.setDaemon(true);}

以上程序执行结果如下图所示:

 

  

 

  从上述结果可以看出,当我们将 setDaemon(true) 设置在 start() 之后,不但程序的执行会报错,而且设置的守护线程也不会生效。

  

 

  

总结

在 Java 语言中线程分为两类:用户线程和守护线程,默认情况下我们创建的线程或线程池都是用户线程,守护线程是为用户线程服务的,当一个程序中的所有用户线程都执行完成之后程序就会结束运行,程序结束运行时不会管守护线程是否正在运行,由此我们可以看出守护线程在 Java 体系中权重是比较低的,这就是守护线程和用户线程的区别。

 

  到此这篇关于Java守护线程和用户线程的区别的文章就介绍到这了,更多相关Java 守护线程内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: