您的位置 首页 java

java并发编程-后台线程(daemon thread)

后台线程是在后台提供一种服务,与用户写的程序一起运行,但是它不是程序中不可或缺的部分。当所有的非后台线程执行完成后,程序终止,杀掉所有的后台线程。比如我们的垃圾回收器就是我们的后台线程。我们下面看一个简单的daemon Thread的例子:

输出结果:

程序分析:

1、通过Thread实例的setDaemon(true)将线程设置为后台线程,但是必须在其start()之前设置

2、通过程序观察发现,子线程死循环每隔100毫秒输出当前线程的名字,但是会发现main()主线程175毫秒后,main()执行完成,没有非后台线程了,程序因此退出了

通过实现ThreadFactory接口实现自定义线程

我们可以实现ThreadFactory,自定义线程及其属性并返回,我们看下面的代码:

看下ThreadFactory接口的定义,如下图所示:

从注释我们可以清楚的了解到,我们可以实现ThreadFactory,为自己的线程定义优先级、daemon状态等等,我们通过工厂就可以获取自定义的线程实现类,可以将其传递给Executors.newCachedThreadPool()。我们看think in java 的示例代码:

代码分析:

1、Executors.newCachedThreadPool() ,传递自定义线程工厂,这个时候Exectors会根据这个线程工厂创建线程实例来执行DaemonFormFactory的run()方法

后台线程创建的任何线程都是后台线程

将一个线程设置为后台线程后,其后台线程继续创建新的线程,其全部都是后台线程,可以通过isDaemon()测试,我们看下面的think in java的例子程序:

输出结果:

程序分析:

我们将Daemon类设置为后台线程,由它继续创建的线程实例自动被设置为后台线程,通过输出isDaemon() true 验证

后台线程终止不会执行finally语句

最后一个知识点,当后台线程退出的时候,finally语句不会被执行,我们通过下面的例子看下:

输出结果

程序分析:

当设置子线程为后台线程,main()方法结束, jvm 会立即关闭所有的后台线程,所以finally语句块没有执行。

文章来源:智云一二三科技

文章标题:java并发编程-后台线程(daemon thread)

文章地址:https://www.zhihuclub.com/191654.shtml

关于作者: 智云科技

热门文章

网站地图