2

我应该在线程完成工作后将线程引用显式设置为 null 还是没有必要?如果我想将其设置为 null 那么我应该在代码中的哪个位置执行此操作?

我应该使用标志检查线程是否处于活动状态thread.isalive,然后如果它不活动则将其设置为 null 吗?

4

2 回答 2

3

您应该像对待任何其他对象一样对待 Thread :
仅在需要时保留引用(例如对于 a Join())。

当您确实有一个长期引用 ta Thread(即在静态字段中)null时,您应该将其设置为不再需要它的时间。但最好不要有这样的变量。

于 2012-05-20T07:38:35.463 回答
3

我应该在线程完成工作后将线程引用显式设置为 null 还是没有必要?

就个人而言,我不会打扰。在某些情况下,明确地将对象引用设置为 null 确实很重要。无论类型如何,这些案例都是:

  • 如果变量是静态成员并且它引用的对象会消耗大量内存。
  • 如果该变量是一个包含在更长生命周期的对象中的实例成员,该对象引用了一个消耗大量内存的对象。
  • 如果变量是长时间运行的方法的局部变量,该方法引用了一个消耗大量内存的对象。1

这些是我能想到的。也许还有更多,但可能不多。这里的共同点是变量引用了一个消耗大量内存的对象。托管Thread对象本身不会消耗大量内存,因此我无法想象将类型变量设置Thread为 null 将为您完成很多工作,无论它如何使用。大多数资源在线程启动时分配,然后在线程结束时释放。

我是否应该使用 thread.isalive 标志检查线程是否处于活动状态,如果它不活动,则将其设置为 null。

我更喜欢使用Thread.Join来测试并等待线程完成。事实上,我从来没有用过Thread.IsAlive任何有用的东西……曾经。


1如果 GC 可以检测到不再使用引用,则 GC 实际上足够聪明,可以在方法结束之前处理本地对象引用。

于 2012-05-21T02:17:00.563 回答