代码之家  ›  专栏  ›  技术社区  ›  ubiquibacon

关于Java中线程问题的几个问题

  •  0
  • ubiquibacon  · 技术社区  · 14 年前

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

    1)为了试验而不是使用 new Thread thread.start() 我试过 ExecutorService 我没有得到任何警告。 这是否意味着如果我使用 执行服务 ?

    2.)另外,如果我有 执行服务 以缓存线程池的形式,将使用 新线程 启动() 从缓存池中拉出一个线程(如果一个线程不可用,则使其创建一个线程),或者这些线程完全独立于缓存的线程池?

    3 回复  |  直到 14 年前
        1
  •  5
  •   aioobe    14 年前

    1)[…] 这是否意味着如果我使用 ExecutorService ?

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

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

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

        2
  •  1
  •   Mark Peters    14 年前

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

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

    2)不, new 总是创建一个新对象,没有异常。你要绕过线程池。

        3
  •  0
  •   greuze    14 年前

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