关于Java中的线程的一些问题

时间:2010-09-29 13:12:06

标签: java multithreading threadpool executorservice

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

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

2。)另外,如果我有一个缓存线程池形式的ExecutorService,那么new Threadthread.start()的标准方法创建一个新线程来自缓存池的线程(或者如果一个线程不可用则导致它创建一个)或者这些线程是否完全独立于缓存的线程池?

3 个答案:

答案 0 :(得分:5)

  

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

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

  

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

不,new无法重载到而不是创建一个新对象。在这种情况下,您需要通过工厂方法。

答案 1 :(得分:1)

1)不,这可能只是NetBeans静态分析的一个限制。当然,如果你没有泄漏对当前正在构造的对象的引用,那么以任何一种方式都是安全的。

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

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

答案 2 :(得分:0)

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