0

首先是一点背景。我在 NetBeans 中收到警告,告诉我不要在构造函数中启动新线程。我已经读过这样做的原因是因为新线程可能会启动并尝试引用该对象在构造函数实际完成创建对象之前启动线程。

1.)为了实验而不是使用new Threadthread.start()我试过ExecutorService了,我没有收到任何警告。 这是否意味着如果我使用可以在构造函数中创建和启动新线程ExecutorService

2.)另外,如果我有ExecutorService一个缓存线程池的形式,将通过标准方法创建一个新线程new Threadthread.start()从缓存池中拉出一个线程(或者如果一个线程不可用,则导致它创建一个)还是这些线程完全独​​立于缓存线程池?

4

3 回答 3

5

1)[...]这是否意味着如果我使用可以在构造函数中创建和启动一个新线程ExecutorService

this一般规则:在完全构造之前,不要泄漏对正在构造的对象的引用 ( )。也就是说,不要在构造函数中放弃this另一个 therad,不要在构造函数中将自己添加为侦听器,等等,等等……也就是说,永远不要this在构造函数中用作函数的参数。

2) [...]将通过标准方法创建一个新线程new Threadthread.start()从缓存池中拉出一个线程[...]

不,没有办法new重载创建新对象。在这种情况下,您将需要通过工厂方法。

于 2010-09-29T13:19:20.137 回答
1

1) 不,这可能只是 NetBeans 静态分析的限制。当然,如果您不泄漏对当前正在构造的对象的引用,那么无论哪种方式都是安全的。

泄漏对正在构造的对象的引用不仅在多线程情况下是危险的。即使您从构造函数调用外部方法,将您自己作为参数传递,该方法也可能不恰当地使用您。

2)不,new总是创建一个新对象,没有例外。你正在绕着线程池走。

于 2010-09-29T13:18:25.223 回答
0

构造函数的职责只是构造一个对象,如果你有一个扩展 Thread 的对象,你不应该从构造函数内部调用 start(),其他不同的对象应该调用 start()。

于 2010-09-29T13:45:44.140 回答