2012-05-20 25 views
1

在线程完成它的工作之后,我应该显式地将线程引用设置为null还是没有必要?如果我想将它设置为null,那么我应该在代码中执行此操作?线程完成后,我应该明确地将线程引用设置为null吗?

我应该使用thread.isalive标志检查线程是否存活,如果线程没有活动,则将其设置为空?

+1

为什么你想把参数设置为null? –

+1

@DavidHeffernan这就是我问的问题? – Charu

回答

2

在线程 完成它的工作或它没有必要之后,我应该明确地设置线程引用为null吗?

个人而言,我不打扰。在某些情况下,将对象引用显式设置为null真的很重要。不管类型如下:

  • 如果变量是静态成员,并且它引用的对象会消耗大量内存。
  • 如果该变量是一个实例成员,它包含在一个较长的活动对象中,该对象引用了消耗大量内存的对象。
  • 如果该变量是一个长时间运行的方法的本地引用消耗大量内存的对象。

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

我应该检查,如果线程是活着还是不使用thread.isalive标志和 然后将其设置为null,如果它不是活着。

我更喜欢用Thread.Join来测试并等待线程完成。事实上,我有从来没有使用Thread.IsAlive任何有用的......有史以来。


的GC实际上是足够聪明,处理本地对象的引用之前的方法结束,如果它能够检测到基准不再使用。

3

你应该把一个线程像任何其他对象:
保持基准只要只因为你需要它(例如用于Join())。

当你确实有一个长时间参考线程(即在一个静态字段中),那么当你不再需要它时,你应该将它设置为null。但最好不要有这样的变数。

+1

这与知道原始海报中引用的变量是相关的。局部变量或实例字段(在什么对象上)或静态字段? –

+0

@JeppeStigNielsen这是一个静态字段 – Charu

+0

@Charu - 然后尝试重新设计并摆脱它。 –

相关问题