2

我在 stackoverflow 上看到了一些帖子,并阅读了 oracle 发布的关于销毁线程的教程。据我了解,一旦你start()有了一个线程,你就不能用它stop()来删除那个线程。sleep()与其实际从调度程序中删除线程,不如建议无限期地使线程。这种想法对吗?

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

4

2 回答 2

3

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

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

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

希望这可以帮助!

于 2013-01-11T05:04:17.367 回答
1

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

while (!condition && !stop) {
    try {
        someBlockingFunction(); // A lock, take on a BlockingQueue, etc.
    } catch (InterruptedException e) { //ignored }
}

退出 while 循环后,检查是否有stop = true另一个线程向我们发出停止 ( ) 的信号,如果是,则从run()函数返回以允许线程自行清理。

于 2013-01-11T05:15:51.747 回答