《在路上 …》 京城寂寞夜

40827537-e005-3531-811e-f6498e876e53.jpg
合租的两位同学忽然间都夜不归宿了.

美好的遐想是被包养, 现实的假设是去出差.

无论是那种, 反正硕大的房间空空如野的.

人生很多时候真是机缘巧合.

两位同学居然都是我在成都读大学时候同一个码农工作室的,毕业后又纷纷来到北京, 最后大家居然又住到了一起.

加入那个工作室, 其实也是一段非常奇遇般的经历.

当时我一如既往的在宿舍看着图书馆中无穷无尽的小说, 忽然对床的人拉住我说, 学校有个工作室可以加入.

那时已经大三, 对于一个不学习, 不打架,不泡mm的三不青年来说, 社团是毫无吸引的东西.

我不动声色, 翻转了一下高高在上的躯体(宿舍的床很高), 接着看小说.

同学又说, 可以免费上网,晚上不停电,还有工资哦 ...

我们那个万恶的电子科技大学, 在宿舍上网是6毛钱一个小时的.

对于没钱的穷学生来说, 简直是的一刀一刀的割肉凌迟.

而晚上11点的停电, 在我看来, 就是网吧老板与学校狼狈为奸, 将学生逼上梁山的荒诞剧.

在这种生不如死的环境中, 哪怕是一根救命的稻草, 也会被我紧紧的抓住.

于是, 我可耻的心动了.

然后就去了, 然后台式电脑也搬去了.

环境比想象的还好, 居然有空调和饮水机.

“颜回所乐是箪瓢”, 那就是当时的我.

每天中午起床, 去工作室上网, 晚上2,3点回来, 吃成都廉价的烧烤.

寂静校园, 午夜宅男, 多么浪漫的猥琐片.

就这样, 在荒淫无度中, 我错过了学习如何去爱的黄金岁月.

好吧,仿照<ON AIR>
http://movie.douban.com/subject/3003086/
http://www.qiyi.com/dianshiju/onair.html

来模仿一句名台词吧 "再这样, DNA就要失传了"

文章同步自 http://kanrss.com/~onway/t/102
同步程序见 这里
作者 张沈鹏



<think>嗯,用户想了解Java中守护线程和setDaemon方法的使用教程。首先,我需要回忆守护线程的定义和特性。守护线程(Daemon Thread)在Java中是为其他线程提供服务的后台线程,它的生命周期依赖于非守护线程的存在。当所有非守护线程结束时,守护线程会自动终止,不管它是否还在执行任务。这一点很重要,用户可能需要注意守护线程可能被突然终止的情况。 接下来,setDaemon方法的使用方法。这个方法必须在启动线程之前调用,否则会抛出IllegalThreadStateException。我需要明确说明这一点,避免用户在使用时犯错误。另外,守护线程不能用于访问固有资源,比如文件或数据库,因为可能在操作中途被终止,导致数据不一致。 然后,应用场景。比如后台任务、监控或心跳检测、垃圾回收等。需要举一些具体的例子,帮助用户理解何时使用守护线程。例如,日志写入、心跳包发送等,这些任务即使没有完成,也不会影响程序退出。 实现步骤部分,需要分点说明如何创建和设置守护线程。例如,继承Thread类或实现Runnable接口,调用setDaemon(true),启动线程等。代码示例是必须的,这样用户可以直接参考。同时,要注意代码中的注释,说明关键点,比如设置守护线程的位置和可能抛出的异常。 注意事项方面,除了setDaemon的调用时机,还要提到守护线程创建的子线程默认也是守护线程,以及资源释放的问题。用户可能在编写守护线程时忘记处理这些细节,导致资源泄漏或其他问题。 相关引用部分,用户提供的三个引用中,引用[1]和[2]直接相关,需要正确标注。可能还需要确认引用的内容是否准确,比如引用[3]提到C#的IsBackground属性,但用户的问题是关于Java的,所以可能不需要深入讨论,但可以简要比较,帮助有跨语言经验的用户理解。 用户可能的需求是了解如何正确使用守护线程,避免常见错误,比如在错误的位置调用setDaemon,或者不理解守护线程的生命周期。需要强调守护线程的自动终止特性,以及它适合的场景,比如不重要的后台任务,而不是关键操作。 最后,生成相关问题时要覆盖守护线程的特性、使用注意事项、与普通线程的区别、应用场景,以及跨语言的比较。这样用户如果有进一步的问题,可以自行探索。</think>### Java守护线程与setDaemon()方法使用教程 #### 一、守护线程核心概念 1. **定义**:守护线程(Daemon Thread)是为其他线程提供服务的后台线程,其生命周期依赖于非守护线程。当所有非守护线程结束时,守护线程会自动终止,即使任务未完成[^1]。 2. **特性**: - 无法独立存在,需依附于非守护线程 - JVM退出时不保证守护线程执行完毕 - 默认情况下,新线程为非守护线程 #### 二、setDaemon()方法使用步骤 1. **方法签名**: ```java public final void setDaemon(boolean on) ``` 2. **实现流程**: ```java Thread daemonThread = new Thread(() -> { while (true) { System.out.println("守护线程运行中..."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }); daemonThread.setDaemon(true); // ★ 必须在start()前调用 daemonThread.start(); // 主线程结束则守护线程自动终止 ``` - 若在`start()`后调用会抛出`IllegalThreadStateException` - 守护线程中创建的线程默认也是守护线程 #### 三、典型应用场景 1. **后台日志记录**:自动清理日志文件 2. **心跳检测**:定时发送网络心跳包 3. **缓存刷新**:周期性地更新缓存数据 4. **垃圾回收辅助**:JVM的GC线程本身就是守护线程 #### 四、注意事项 1. **资源安全**:避免在守护线程中进行关键I/O操作(如文件写入),可能因线程突然终止导致数据丢失 2. **生命周期管理**:不要依赖`finally`块执行资源释放 3. **优先级控制**:守护线程默认继承父线程优先级,可通过`setPriority()`调整 4. **异常处理**:守护线程抛出的异常不会传播到主线程 #### 五、完整示例代码 ```java public class DaemonDemo { public static void main(String[] args) { Thread daemon = new Thread(() -> { while (true) { System.out.println("后台服务运行中..." + LocalTime.now()); try { Thread.sleep(500); } catch (InterruptedException e) { break; } } }); daemon.setDaemon(true); daemon.start(); // 主线程工作模拟 System.out.println("主线程开始工作"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("主线程结束"); } } ``` 输出结果: ``` 主线程开始工作 后台服务运行中...10:15:30.123 后台服务运行中...10:15:30.623 后台服务运行中...10:15:31.124 主线程结束 (程序终止) ``` #### 六、与普通线程对比 | 特性 | 守护线程 | 普通线程 | |--------------------|-------------------|-------------------| | 终止条件 | 随主线程结束 | 执行完run()方法 | | 默认优先级 | 继承父线程优先级 | 同左 | | 影响JVM退出 | 不阻止 | 会阻止 | | 适用场景 | 辅助性任务 | 核心业务逻辑 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值