0

我正在用 Java 编写一个聊天服务器。我使用了一个固定的可运行类数组,其中数组中的每个元素都代表一个客户端。创建的线程处于从套接字流读取的无限循环中。

现在我想用一个列表来做,所以我不必担心数组的大小,而且这听起来更合法。但是我不能确定删除一个项目是否也会终止线程。其实我不知道它是做什么的。另外,我想知道在这种情况下使用列表是否还有其他可能的问题。最后,Timer 数组怎么样?由于我已经为每个客户端使用了 Timer,所以从 Timer 列表中删除 Timer 是否也会停止其日程安排?有什么可能的问题吗?

4

4 回答 4

1

一个对象本身就存在——将对该对象的引用存储在一个列表中不会改变它的行为。

因此,如果您有一个在线程中运行的 Runnable 任务,将其添加到列表中/从列表中删除它不会对该 Runnable 产生影响,并且线程将继续运行它。

这同样适用于 Timer 和任何其他对象。

旁注:在一种情况下,从列表中删除对象会产生影响:如果该对象只能通过该列表访问。被删除后,因为它不再可达,它变得有资格进行垃圾收集。但这不适用于正在运行的线程或活动计时器。

于 2012-08-12T18:57:47.733 回答
1

你有一个线程对象。对它的引用被插入到数组中。从数组(即线程)中添加或删除引用不会导致任何未知的副作用,所以你很好。如果你想停止线程,你将不得不在你的run方法内部实现它。垃圾收集在这里不是问题。

定时器又是同样的问题:它们都是对象引用。

于 2012-08-12T18:58:37.350 回答
1

正在运行的线程被认为是所谓的垃圾收集根。任何作为根或可以(间接)从根引用的东西都不会被垃圾收集。当垃圾收集器确定您的对象是否“可达”时,它总是使用垃圾收集器根集作为参考点。

于 2012-08-12T19:00:02.147 回答
0

嘿,我会参考这个问题!

如果线程被启动,它不会被垃圾收集,因为它被包含线程引用。

如果它已完成或尚未启动,它将被垃圾收集!

这样做的原因是,当启动线程对象时,它会被添加到当前线程对象中ThreadGroup(在幕后有点复杂:)),当它完成时,它会自动删除。

于 2012-08-12T18:59:05.400 回答