【问题标题】:Does removing an item from a list of class extending runnable terminates its thread?从扩展可运行的类列表中删除项目是否会终止其线程?
【发布时间】:2012-08-12 18:54:31
【问题描述】:
我正在用 Java 编写一个聊天服务器。我使用了一个固定的可运行类数组,其中数组中的每个元素都代表一个客户端。创建的线程处于从套接字流读取的无限循环中。
现在我想用一个列表来做这件事,所以我不必担心数组大小,而且这听起来更合法。但是我不能确定删除一个项目是否也会终止线程。其实我不知道它是做什么的。另外,我想知道在这种情况下使用列表是否还有其他可能的问题。最后,Timer 数组怎么样?既然我已经为每个客户端使用了 Timer,那么从 Timer 列表中删除 Timer 是否也会停止其日程安排?有什么可能的问题吗?
【问题讨论】:
标签:
java
list
timer
runnable
【解决方案1】:
对象本身存在 - 将对该对象的引用存储在列表中不会改变其行为。
因此,如果您有一个在线程中运行的 Runnable 任务,将其添加到列表中/从列表中删除不会对该 Runnable 产生影响,并且线程将继续运行它。
这同样适用于 Timer 和任何其他对象。
旁注:在一种情况下,从列表中删除对象会产生影响:如果该对象只能通过该列表访问。被删除后,由于不再可访问,因此有资格进行垃圾回收。但这不适用于正在运行的线程或活动计时器。
【解决方案2】:
你有一个线程对象。对它的引用被插入到数组中。从数组(即线程)中添加或删除引用不会导致任何未知的副作用,所以你很好。如果要停止线程,则必须在 run 方法内部实现该线程。垃圾收集在这里不是问题。
定时器又是同样的问题:它们都是对象引用。
【解决方案3】:
正在运行的线程被认为是所谓的垃圾收集根。任何作为根或可以(间接)从根引用的东西都不会被垃圾收集。当垃圾收集器确定您的对象是否“可达”时,它总是使用垃圾收集器根集作为参考点。
【解决方案4】:
嘿,我会refer to this question!
如果线程被启动,它不会被垃圾回收,因为它被包含的线程引用。
如果完成或尚未启动,它将被垃圾收集!
这样做的原因是,当启动时,线程对象被添加到当前的ThreadGroup(在后台有点复杂:)),当它完成时它会自动删除。