在对象构造函数中启动线程池是否安全?我知道你不应该从构造函数中启动线程,比如" this“指针转义(我不太理解这一点,但我会做更多的搜索来尝试弄清楚)。
代码将如下所示:
private ExecutorService pool;
public handler()
{
pool = Executors.newCachedThreadPool();
}
public void queueInstructionSet(InstructionSet set)
{
pool.submit(new Runnable that handles this instruction set);
}如果这不起作用,我可以将这个类创建为一个Runnable并在一个新线程中启动它。然而,这似乎会给程序添加一个不必要的线程,因为它并不真正需要一个线程。
谢谢。
编辑:
感谢每个人的回复,他们确实帮助我们理解了这一点。
根据代码,在我看来,这个构造函数创建线程池是有意义的,但让我解释一下这段代码具体做了什么,因为我可能会以一种奇怪的方式思考这个问题。
这个对象的全部要点是获取“指令集”对象,并相应地对其执行操作。指令集来自连接到服务器的客户端。一旦从客户端接收到完整的指令集,该指令集就被发送到该对象(处理程序)进行处理。
此处理程序对象包含对指令集可以操作的每个对象的引用。它将指令集提交给线程池,线程池将找到该指令集要与哪个对象交互,然后处理该对象上的指令集。
我可以在IO服务器中处理指令集对象,但我的想法是有一个单独的类,因为它使整个代码更具可读性,因为每个类只专注于做一件特定的事情。
有什么想法?建议?
谢谢
发布于 2010-08-17 00:57:29
您的示例代码根本不会让"this“转义。在构造函数中启动一个新线程是相当安全的(甚至使用this作为Runnable,本例中没有这样做),只要您确定已经初始化了新线程所需的对象即可。例如,设置一个新线程在启动线程后将依赖的final字段将是一个非常糟糕的想法:)
基本上,让"this“引用转义通常是令人讨厌的,但不是普遍如此。在某些情况下,它是安全的。小心点就好。
话虽如此,让构造函数启动线程可能会被视为在构造函数中做了太多的事情。很难说它在这种情况下是否合适-我们对您的代码所做的事情知之甚少。
编辑:是的,在阅读了额外的信息后,我认为这是可以的。您可能还应该有一个关闭线程池的方法。
发布于 2010-08-17 01:02:57
我同意乔恩的观点。
此外,我要指出的是,您实际上并没有在构造函数的线程池上启动任何操作。您正在实例化线程池,但此时它没有要运行的任务。因此,正如所写的,你不会让一些东西在它完成构造之前在这个实例上开始运行。
发布于 2010-08-17 01:04:13
这听起来像是线程池将由对象拥有和使用;线程不会传递到对象之外。如果是这样的话,这不应该是一个问题。
构造函数创建一个对象并初始化它的状态。我无法想象需要长时间运行的进程来执行此操作的用例。
我可以看到对象可以在何处与线程池交互以完成任务,但我不认为该对象需要拥有线程池。
更多细节可能会有所帮助。
https://stackoverflow.com/questions/3495350
复制相似问题