首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java在对象构造函数中启动线程池

Java在对象构造函数中启动线程池
EN

Stack Overflow用户
提问于 2010-08-17 00:50:21
回答 4查看 1.2K关注 0票数 2

在对象构造函数中启动线程池是否安全?我知道你不应该从构造函数中启动线程,比如" this“指针转义(我不太理解这一点,但我会做更多的搜索来尝试弄清楚)。

代码将如下所示:

代码语言:javascript
运行
复制
private ExecutorService pool;

public handler()
{
  pool = Executors.newCachedThreadPool();
}

public void queueInstructionSet(InstructionSet set)
{
  pool.submit(new Runnable that handles this instruction set);
}

如果这不起作用,我可以将这个类创建为一个Runnable并在一个新线程中启动它。然而,这似乎会给程序添加一个不必要的线程,因为它并不真正需要一个线程。

谢谢。

编辑:

感谢每个人的回复,他们确实帮助我们理解了这一点。

根据代码,在我看来,这个构造函数创建线程池是有意义的,但让我解释一下这段代码具体做了什么,因为我可能会以一种奇怪的方式思考这个问题。

这个对象的全部要点是获取“指令集”对象,并相应地对其执行操作。指令集来自连接到服务器的客户端。一旦从客户端接收到完整的指令集,该指令集就被发送到该对象(处理程序)进行处理。

此处理程序对象包含对指令集可以操作的每个对象的引用。它将指令集提交给线程池,线程池将找到该指令集要与哪个对象交互,然后处理该对象上的指令集。

我可以在IO服务器中处理指令集对象,但我的想法是有一个单独的类,因为它使整个代码更具可读性,因为每个类只专注于做一件特定的事情。

有什么想法?建议?

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-17 00:57:29

您的示例代码根本不会让"this“转义。在构造函数中启动一个新线程是相当安全的(甚至使用this作为Runnable,本例中没有这样做),只要您确定已经初始化了新线程所需的对象即可。例如,设置一个新线程在启动线程后将依赖的final字段将是一个非常糟糕的想法:)

基本上,让"this“引用转义通常是令人讨厌的,但不是普遍如此。在某些情况下,它是安全的。小心点就好。

话虽如此,让构造函数启动线程可能会被视为在构造函数中做了太多的事情。很难说它在这种情况下是否合适-我们对您的代码所做的事情知之甚少。

编辑:是的,在阅读了额外的信息后,我认为这是可以的。您可能还应该有一个关闭线程池的方法。

票数 3
EN

Stack Overflow用户

发布于 2010-08-17 01:02:57

我同意乔恩的观点。

此外,我要指出的是,您实际上并没有在构造函数的线程池上启动任何操作。您正在实例化线程池,但此时它没有要运行的任务。因此,正如所写的,你不会让一些东西在它完成构造之前在这个实例上开始运行。

票数 1
EN

Stack Overflow用户

发布于 2010-08-17 01:04:13

这听起来像是线程池将由对象拥有和使用;线程不会传递到对象之外。如果是这样的话,这不应该是一个问题。

构造函数创建一个对象并初始化它的状态。我无法想象需要长时间运行的进程来执行此操作的用例。

我可以看到对象可以在何处与线程池交互以完成任务,但我不认为该对象需要拥有线程池。

更多细节可能会有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3495350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档