Java中的守护线程

1.概述

在这篇简短的文章中,我们将看看Java中的守护线程,看看它们可以用于做什么。我们还将解释守护线程和用户线程之间的区别。

2.守护进程和用户线程之间的区别

Java提供两种类型的线程:用户线程和守护程序线程。

用户线程是高优先级线程。JVM将在终止任务之前等待任何用户线程完成其任务。

另一方面,守护线程是低优先级线程,其唯一作用是为用户线程提供服务。

由于守护线程旨在为用户线程提供服务,并且仅在用户线程运行时才需要,因此它们都不会退出JVM,直到所有用户线程执行完成。

这就是为什么通常存在于守护线程中的无限循环不会导致问题,因为任何代码(包括finally块)都不会在所有用户线程完成执行后执行。因此,不建议将守护线程用于I / O任务。

但是,这条规则有例外。守护线程中设计糟糕的代码可能会阻止JVM退出。例如,在正在运行的守护线程上调用Thread.join()可以阻止应用程序的关闭。

3.守护线程的使用

守护线程对于后台支持任务非常有用,例如垃圾收集,释放未使用对象的内存以及从缓存中删除不需要的条目。大多数JVM线程都是守护线程。

4.创建守护线程

要将线程设置为守护线程,我们需要做的就是调用Thread.setDaemon()。在这个例子中,我们将使用扩展Thread类的NewThread类:

NewThread daemonThread = new NewThread();
daemonThread.setDaemon(true);
daemonThread.start();

任何线程都继承创建它的线程的守护进程状态。由于主线程是用户线程,因此在main方法内创建的任何线程默认为用户线程。

方法setDaemon()只能在创建Thread对象并且尚未启动线程后调用。在其它状态下试图调用setDaemon()将抛出IllegalThreadStateException:
···
@Test(expected = IllegalThreadStateException.class)
public void whenSetDaemonWhileRunning() {
NewThread daemonThread = new NewThread();
daemonThread.start();
daemonThread.setDaemon(true);
}
···

5.检查线程是否是守护线程

最后,要检查一个线程是否是一个守护程序线程,我们可以简单地调用方法isDaemon():

@Test
public void whenCallIsDaemon_thenCorrect() {
    NewThread daemonThread = new NewThread();
    NewThread userThread = new NewThread();
    daemonThread.setDaemon(true);
    daemonThread.start();
    userThread.start();
     
    assertTrue(daemonThread.isDaemon());
    assertFalse(userThread.isDaemon());
}

6.结论

在这个快速教程中,我们已经看到了守护程序线程是什么以及在一些实际场景中它们可以用于什么。


关注公众号:「Java知己」,每天更新Java知识哦,期待你的到来!

  • 发送「1024」,免费领取 30 本经典编程书籍。
  • 发送「Group」,与 10 万程序员一起进步。
  • 发送「JavaEE实战」,领取《JavaEE实战》系列视频教程。
  • 发送「玩转算法」,领取《玩转算法》系列视频教程。

image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值