在Java中销毁线程

在Java中销毁线程,java,multithreading,threadpool,Java,Multithreading,Threadpool,我在stackoverflow上看到了一些帖子,并通读了oracle发布的关于销毁线程的教程。据我所知,一旦你start()一个线程,你就不能用stop()来删除这个线程。建议无限期地使线程sleep(),而不是从调度程序中实际删除线程。这种想法正确吗 这也引出了我的下一个问题,这就是为什么人们使用线程池?而不是“睡眠”线程,使用该线程处理其他作业比创建新线程更明智。请让我知道我对多线程管理的理解是否正确。Java不允许以安全的方式完全删除线程是没有意义的。通常认为,在线程启动后强制停止线程(或

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


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

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

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

这与线程池存在的原因无关。线程池非常有用,因为由于跟踪线程的状态和进度所需的内部JVM或操作系统级别的簿记,通常会有一些与创建或销毁线程相关的开销。线程池通过让线程睡眠直到任务准备就绪,然后唤醒并执行任务,使线程可以循环使用并执行不同的任务。这可能比产生一个新线程、自己执行任务然后拆掉线程快得多


希望这有帮助

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

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

这与线程池存在的原因无关。线程池非常有用,因为由于跟踪线程的状态和进度所需的内部JVM或操作系统级别的簿记,通常会有一些与创建或销毁线程相关的开销。线程池通过让线程睡眠直到任务准备就绪,然后唤醒并执行任务,使线程可以循环使用并执行不同的任务。这可能比产生一个新线程、自己执行任务然后拆掉线程快得多


希望这有帮助

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

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

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

如templatetypedef所述,您不应该强制停止线程,应该向线程发出停止的信号。例如,每当线程阻塞时,都应该在while循环中执行,该循环测试线程阻塞的条件以及退出的条件:

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

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

这很有意义。我有一个登录线程,我想在它完成生成我的另一个线程时销毁它。据我所知,它不应该使用任何锁,因此我很想告诉它。stop()。但是,它是一个swing线程,因此我可能不知道它在gui调度程序下有任何锁。我怎么知道我的简单gui线程可能持有什么锁呢?这很有意义。我有一个登录线程,我想在它完成生成我的另一个线程时销毁它。据我所知,它不应该使用任何锁,因此我很想告诉它。stop()。但是,它是一个swing线程,因此我可能不知道它在gui调度程序下有任何锁。我怎么知道我的简单gui线程可能持有什么锁?