在Java有两种线程一个是主线程一个是守护线程。而setDaemon()方法就是将当前线程设置为守护线程的方法。守护线程的特点就是当主线程结束时,守护线程自动终止。我们通过下面的例子演示这个效果。

/**

* 消息生产者

*

* @author Sama

* @author admin@jilinwula.com

* @date 2017-03-13 16:31

* @since 1.0.0

*/

public class MessageServer implements Runnable {

@Override

public void run() {

for (int i = 1; i <= 20; i++) {

try {

Thread.sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName());

}

}

}

/**

* 消息消费者

*

* @author Sama

* @author admin@jilinwula.com

* @date 2017-03-13 16:41

* @since 1.0.0

*/

public class MessageClient {

public static void main(String[] args) throws InterruptedException {

MessageServer messageServer = new MessageServer();

Thread thread = new Thread(messageServer);

thread.setDaemon(true);

thread.start();

Thread.sleep(1000);

System.out.println("主线程停止");

}

}

Thread-0

主线程停止

Thread-0

我们看输出信息得知。虽然我们没有在循环中添加任何让线程停止的代码,但线程明显示没有执行完就自动停止了,这就是因为主线程停止了,所以守护线程也就没什么存在的必要了。最典型的守护线程就是Java的垃圾回收器的线程了。这里有一个需要特别注意的地方就是设置守护线程必须在线程没有开启时设置。也就是说必须要在start()方法之前设置。否则该线程不但不能设置为守护线程,Jvm还会抛出异常信息。

/**

* 消息生产者

*

* @author Sama

* @author admin@jilinwula.com

* @date 2017-03-13 16:31

* @since 1.0.0

*/

public class MessageServer implements Runnable {

@Override

public void run() {

for (int i = 1; i <= 20; i++) {

try {

Thread.sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(String.format("i: %s thread: %s", i, Thread.currentThread().getName()));

}

}

}

/**

* 消息消费者

*

* @author Sama

* @author admin@jilinwula.com

* @date 2017-03-13 16:41

* @since 1.0.0

*/

public class MessageClient {

public static void main(String[] args) throws InterruptedException {

MessageServer messageServer = new MessageServer();

Thread thread = new Thread(messageServer);

thread.start();

thread.setDaemon(true);

Thread.sleep(1000);

System.out.println("主线程停止");

}

}

Exception in thread "main" java.lang.IllegalThreadStateException

at java.lang.Thread.setDaemon(Thread.java:1352)

at MessageClient.main(MessageClient.java:14)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

i: 1 thread: Thread-0

i: 2 thread: Thread-0

i: 3 thread: Thread-0

i: 4 thread: Thread-0

i: 5 thread: Thread-0

i: 6 thread: Thread-0

i: 7 thread: Thread-0

i: 8 thread: Thread-0

i: 9 thread: Thread-0

i: 10 thread: Thread-0

i: 11 thread: Thread-0

i: 12 thread: Thread-0

i: 13 thread: Thread-0

i: 14 thread: Thread-0

i: 15 thread: Thread-0

i: 16 thread: Thread-0

i: 17 thread: Thread-0

i: 18 thread: Thread-0

i: 19 thread: Thread-0

i: 20 thread: Thread-0

java setdaemon_setDaemon()方法的使用相关推荐

  1. 零基础全方位学习java的方法

    java技术岗是一个就业率非常高的岗位,因此有很多人都想要学习java技术,其中不乏一些零基础同学,零基础小白都不清楚自己该如何学习java,那么下面小编就为大家详细的介绍一下零基础全方位学习java ...

  2. 几种任务调度的 Java 实现方法与比较

    综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺 ...

  3. 2021-02-23关于java的方法区,为什么叫方法区,是否与实际用途相悖?

    关于java的方法区,为什么叫方法区,是否与实际用途相悖? 在java中,栈中存放的是用来保存方法运行时状态的栈帧,存储了局部变量表,操作数栈等,而方法区存放的是已加载的类的基本信息.常量.静态变量等 ...

  4. 大数据笔记2019.5.9 Java中方法的使用

    方法: 1.方法的概念:(函数/过程) 封装了一段特定的业务逻辑功能 尽可能的独立,一个方法只让干一件事: 方法可以被反复的重新的调用 减少代码的重复,有利于代码的维护,减少团队开发的成本提高开发的效 ...

  5. java ubuntu 14.04,Ubuntu 14.04安装java的方法

    摘要 腾兴网为您分享:Ubuntu 14.04安装java的方法,掌上电力,虚拟按键,新东方,小度等软件知识,以及公务用车平台,手机秀色直播,新视觉影院,浩辰cad批量打印,bartender2016 ...

  6. java中方法的参数传递

    java中方法的参数传递方式只有一种:值传递: 对于基本类型来说,传递的是实参的副本(值传递),故在方法内修改传递进来的值并不会影响实参本身: 对于引用类型来说,传递进来的是引用变量的副本(也是值传递 ...

  7. Java中方法重载和方法重写的区别

    文章目录 1 Java中方法重载和方法重写的区别 1 Java中方法重载和方法重写的区别 主要区别如下: 方法重载: 在同一个类中 方法名相同 参数个数.顺序.类型不同 返回值类型.访问修饰符任意 方 ...

  8. java中que_重写java Eques()方法-不工作吗?

    重写java Eques()方法-不工作吗? 我遇到了一个有趣的(非常令人沮丧的)问题equals()方法,它导致了我认为经过良好测试的类崩溃,并导致了一个错误,我花了很长时间才找到它. 为了完整起见 ...

  9. 几种任务调度的 Java 实现方法与比较--转载

    前言 任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务.本文由浅入深介绍四种任务调度的 Java 实现: Timer ScheduledExecutor 开源工具包 Quartz ...

最新文章

  1. NoClassDefFoundError: org/springframework/core/ErrorCoded 报错
  2. PIE SDK热力图
  3. 垂垂老矣,一代人的回忆,Adobe Flash 寿命将尽
  4. python中的time库安装步骤-python中time库的实例使用方法
  5. 如何在 Microsoft Visual C# .NET 中实现 Microsoft Excel 自动化
  6. 文件类常用方法 c# 1614531951
  7. 全球开发者大调查:编程始于少年,Python 成最爱
  8. 第三届“泰迪杯”数据分析职业技能大赛: 教育平台的线上课程智能推荐 (决赛候选)答辩PPT
  9. RS485芯片与单片机接口中的一个容易忽略的隐患
  10. 百科知识 画法几何创造性思维训练
  11. 运用java画时钟_使用Swing绘制动态时钟
  12. 如何完全清除微信聊天记录
  13. 零基础云开发一个投票小程序
  14. DataV 你值得拥有的大屏展示工具
  15. QFP封装芯片手工焊接和拆卸技巧
  16. 大量STATSPACK数据统计分析
  17. mysql根据姓分组_mysql 分组查询 group by
  18. Appium移动自动化测试(三)--安装Android模拟器(建议直接连手机,跳过此步)
  19. regedit参数+批处理修改IE标题
  20. Python中yield的用法详解——最简单,最清晰的解释

热门文章

  1. 关于CSS3的3D效果样式transform属性中的rotate3d
  2. 爱普生Epson Stylus Photo 700 打印机驱动
  3. ajax获取json数据示例
  4. 数据交换平台的双内存设计
  5. 对什么都不感兴趣,怎么办?
  6. 百度首席财务官海南休假意外溺亡
  7. Ordering使用
  8. 移动web开发框架研究
  9. COMSOL 建模简易保温杯热传导过程整理
  10. 高新技术企业申报的流程