首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >销毁Java中的线程

销毁Java中的线程
EN

Stack Overflow用户
提问于 2013-01-11 12:57:56
回答 2查看 136关注 0票数 2

我在stackoverflow上看到了一些帖子,并通读了oracle发布的关于销毁线程的教程。据我所知,一旦你start()了一个线程,你就不能使用stop()来删除那个线程。建议将线程无限期地sleep(),而不是从调度器中实际删除线程。这样的想法正确吗?

这也引出了我的下一个问题,这就是为什么人们使用thread pools?.而不是“休眠”线程,使用该线程来处理其他作业比创建新线程更有资源。请让我知道我对multi-thread管理的理解是否正确。Java不允许以安全的方式完全删除thread是没有道理的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-11 13:04:17

通常认为,在线程启动(或无限期休眠)后强行停止线程是一个非常糟糕的主意,因为线程将无法清理它所获取的任何资源。例如,如果一个线程获得了一个锁,并被强制终止或无限期休眠,那么该锁将不会被释放,死锁可能会随之而来。类似地,如果线程正在对数据结构进行更改并提前终止,则该数据结构可能处于损坏状态,从而导致稍后出现严重问题。

在Java中停止线程的最好方法是中断线程,并告诉它需要尽快关闭线程。这样,线程可以尝试停止它正在做的事情,并在关闭之前释放任何资源。换句话说,您请求关闭线程,而不是强制终止它。

这与线程池存在的原因无关。线程池很有用,因为通常会有一些与创建或销毁线程相关的开销,这是由于跟踪线程的状态和进度所需的内部JVM或操作系统级别的记账。线程池可以回收线程并让它们执行不同的任务,方法是让线程休眠,直到任务就绪,然后唤醒并执行任务。这比产生一个新线程,自己执行任务,然后拆卸线程要快得多。

希望这能有所帮助!

票数 3
EN

Stack Overflow用户

发布于 2013-01-11 13:15:52

正如templatetypedef所提到的,你不应该强制停止线程,你应该向线程发出停止的信号。例如,每当你的线程阻塞时,它应该在while循环中完成,该循环测试它阻塞的条件,以及要退出的条件:

代码语言:javascript
复制
while (!condition && !stop) {
    try {
        someBlockingFunction(); // A lock, take on a BlockingQueue, etc.
    } catch (InterruptedException e) { //ignored }
}

在退出while循环时,检查另一个线程是否通知我们停止(stop = true),如果是,则从run()函数返回,以允许线程自行清理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14271957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档