2013-01-11 72 views
2

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

此外,这带我到我的下一个问题,这就是为什么人们使用thread pools?.而不是“睡觉”一个线程,它是更多的资源,使用该线程来处理其他工作,而不是创建新的线程。请让我知道,如果我对multi-thread管理的理解是正确的。 Java不允许以安全的方式完全删除thread

回答

3

一旦线程启动(或使其无限期休眠),强行停止线程通常被认为是一个非常糟糕的主意,因为线程无法清理其获取的任何资源。例如,如果一个线程获得一个锁并被无限期地强行杀死或睡眠,那么该锁将不会被释放,并可能发生死锁。同样,如果线程正在对数据结构进行更改并尽早杀死,那么数据结构可能处于损坏状态,从而在以后造成严重问题。

在Java中停止线程的最好方法是中断线程并告诉它需要尽快关闭线程。这样,线程可以尝试停止它正在执行的操作,并在关闭之前释放所有资源。换句话说,你要求要求这个线程关闭,而不是强行杀死它。

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

希望这会有所帮助!

+0

这很有道理。我有一个登录线程,当它完成我的另一个线程时,我想销毁它。据我所知,它不应该使用任何锁,所以我非常想把它告诉给.stop()。然而它是一个摆动线程,所以我可能不知道它在gui调度程序下的任何锁定。我怎么知道我简单的gui线程可能锁定什么? –

1

作为templatetypedef提到,你不应该强行停止一个线程,你应该发信号给一个线程停止。例如,每当你的线程被阻塞,应在while循环测试是阻止病情的不同,以及条件进行戒烟:

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

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