Does it really ends? 论线程终止或被回收

本文探讨了Java中线程的正确终止方式,指出从Java2开始不再推荐使用stop或suspend方法,而应让线程正常执行完run方法或通过标志位控制循环退出,讨论了线程结束后是否会被JVM回收的问题。
从java2以后就不再推荐stop或suspend方法来终止线程,现在大都让线程执行完run方法(如果是后台进程则通过判断标示位跳出死循环结束run方法)的方式来结束线程,但是线程真的就结束了吗?
虽然持有线程对象引用的对象没有被销毁,但是也没再使用的情况下,执行完run方法的线程会象内存一样被JVM自动回收么?
没有google到结果,书上貌似也没讲...求指教如何真正的结束线程
### 关于 Python 中线程 `join` 方法的行为 当在 Python 中调用线程的 `.join()` 方法时,主线程会阻塞直到目标线程完成执行[^1]。然而,如果一个线程在其被加入(`.join()` 被调用)之前已经被终止,则 `.join()` 方法不会阻塞,并且程序将继续运行。 具体来说,在多线程环境中,Python 的 `threading` 模块会在关闭阶段通过 `_shutdown()` 函数遍历所有非守护线程并尝试对其调用 `.join()` 方法来确保它们正常结束。因此,对于那些已经提前终止线程,这种操作是无害的,因为 `.join()` 不会对已停止的线程产生任何影响。 下面是一个简单的例子展示如何处理这种情况: ```python import threading import time def worker(): print("Thread starts") time.sleep(1) # Simulate some work print("Thread ends") t = threading.Thread(target=worker) t.start() time.sleep(0.5) # Let the thread run for a while but ensure it finishes before joining. print("Before join") t.join() # This will not block long as the thread has already finished its task. print("After join") ``` 在这个脚本里,工作线程有时间去启动和完成它的任务,而主线程中的 `.join()` 只是用来确认这一点后再继续自己的流程[^2]。 #### 特殊场景下的注意事项 需要注意的是,如果你有一个循环读取用户输入的线程并且希望优雅地退出整个应用程序,可以考虑设置事件标志者使用其他机制通知该线程何时应该停止其活动。这样能够避免强制中断可能带来的数据丢失其他异常行为。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值