本篇内容介绍了“Java中用户线程与守护线程如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java 语言中无论是线程还是线程池,免费云主机域名默认都是用户线程,因此用户线程也被成为普通线程。以线程为例,想要查看线程是否为守护线程只需通过调用isDaemon()
方法查询即可,如果查询的值为false
则表示不为守护线程,自然也就属于用户线程了,如下代码所示:以上程序的执行结果为:从上述结果可以看出,默认情况下主线程和创建的新线程都为用户线程。PS:Thread.currentThread() 的意思是获取执行当前代码的线程实例。守护线程(Daemon Thread)也被称之为后台线程或服务线程,守护线程是为用户线程服务的,当程序中的用户线程全部执行结束之后,守护线程也会跟随结束。守护线程的角色就像“服务员”,而用户线程的角色就像“顾客”,当“顾客”全部走了之后(全部执行结束),那“服务员”(守护线程)也就没有了存在的意义,所以当一个程序中的全部用户线程都结束执行之后,那么无论守护线程是否还在工作都会随着用户线程一块结束,整个程序也会随之结束运行。那如何将默认的用户线程修改为守护线程呢?这个问题要分为两种情况来回答,首先如果是线程,则可以通过设置setDaemon(true)
方法将用户线程直接修改为守护线程,而如果是线程池则需要通过ThreadFactory
将线程池中的每个线程都为守护线程才行,接下来我们分别来实现一下。如果使用的是线程,可以通过setDaemon(true)
方法将线程类型更改为守护线程,如下代码所示:以上程序的执行结果为:要把线程池设置为守护线程相对来说麻烦一些,需要将线程池中的所有线程都设置成守护线程,这个时候就需要使用ThreadFactory
来定义线程池中每个线程的线程类型了,具体实现代码如下:如下图所示:如上图所示,可以看出,整个程序中有 10 个守护线程都是我创建的。其他几种创建线程池的设置方式类似,都是通过ThreadFactory
统一设置的,这里就不一一列举了。通过前面的学习我们可以创建两种不同的线程类型了,那二者有什么差异呢?接下来我们使用一个小示例来看一下。下面我们创建一个线程,分别将这个线程设置为用户线程和守护线程,在每个线程中执行一个for
循环,总共执行 10 次信息打印,每次打印之后休眠 100 毫秒,来观察程序的运行结果。新建的线程默认就是用户线程,因此我们无需对线程进行任何特殊的处理,执行for
循环即可(总共执行 10 次信息打印,每次打印之后休眠 100 毫秒),实现代码如下:以上程序执行结果如下:从上述结果可以看出,当程序执行完 10 次打印之后才会正常结束进程。以上程序执行结果如下:从上述结果可以看出,当线程设置为守护线程之后,整个程序不会等守护线程for
循环 10 次之后再进行关闭,而是当主线程结束之后,守护线程只执行了一次循环就结束运行了,由此可以看出守护线程和用户线程的不同。守护线程是为用户线程服务的,当一个程序中的所有用户线程都执行完成之后程序就会结束运行,程序结束运行时不会管守护线程是否正在运行,由此我们可以看出守护线程在 Java 体系中权重是比较低的。守护线程的使用需要注意以下三个问题:守护线程的设置setDaemon(true)
必须要放在线程的start()
之前,否则程序会报错。在守护线程中创建的所有子线程都是守护线程。使用jojn()
方法会等待一个线程执行完,无论此线程是用户线程还是守护线程。接下来我们分别演示一下,以上的注意事项。当我们将setDaemon(true)
设置在start()
之后,如下代码所示:以上程序执行结果如下:从上述结果可以看出,当我们将setDaemon(true)
设置在start()
之后,不但程序的执行会报错,而且设置的守护线程也不会生效。以上程序执行结果如下:从上述结果可以看出,守护线程中创建的子线程,默认情况下也属于守护线程。通过 3.2 部分的内容我们可以看出,默认情况下程序结束并不会等待守护线程执行完,而当我们调用线程的等待方法join()
时,执行的结果就会和 3.2 的结果有所不同,下面我们一起来看吧,示例代码如下:以上程序执行结果如下:通过上述结果我们可以看出,即使是守护线程,当程序中调用join()
方法时,程序依然会等待守护线程执行完成之后再结束进程。守护线程的典型应用场景就是垃圾回收线程,当然还有一些场景也非常适合使用守护线程,比如服务器端的健康检测功能,对于一个服务器来说健康检测功能属于非核心非主流的服务业务,像这种为了主要业务服务的业务功能就非常合适使用守护线程,当程序中的主要业务都执行完成之后,服务业务也会跟随者一起销毁。首先来说,线程的类型(用户线程或守护线程)并不影响线程执行的优先级,如下代码所示,定义一个用户线程和守护线程,分别执行 10 万次循环,通过观察最后的打印结果来确认线程类型对程序执行优先级的影响。以上程序执行结果如下:通过上述结果可以看出,线程的类型不管是守护线程还是用户线程对程序执行的优先级是没有任何影响的,而当我们将t2
的优先级调整为最大时,整个程序的运行结果就完全不同了,如下代码所示:以上程序执行结果如下:00000000 通过上述的结果可以看出,程序的类型和程序执行的优先级是没有任何关系,当新创建的线程默认的优先级都是 5 时,无论是守护线程还是用户线程,它们执行的优先级都是相同的,当将二者的优先级设置不同时,执行的结果也会随之改变(优先级设置的越高,最早被执行的概率也越大)。“Java中用户线程与守护线程如何使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注百云主机网站,小编将为大家输出更多高质量的实用文章!
相关推荐: Python怎么使用PyYAML库读写yaml文件
本篇内容介绍了“Python怎么使用PyYAML库读写yaml文件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!YAML,Yet Another Markup …
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。