从自己的构造函数启动一个线程是一个好主意吗?

时间:2010-05-06 10:16:59

标签: java multithreading concurrency

我们可以在同一个对象的构造函数中调用 thread_object.start() 吗?

这种做法是个好主意吗?

5 个答案:

答案 0 :(得分:6)

你可以这样做,但这被认为是不好的做法。在article中有一个关于在构造函数中启动Threads的段落。

在评论中说明了好的机器人,您的问题似乎与this重复。看看Heath Borders在那里的回答。

答案 1 :(得分:2)

只是出于兴趣 - 为什么要扩展Thread?为什么不实现Runnable,您可以获得更大的灵活性(例如,可以在您创建的线程中执行,也可以在ExecutorService中执行,这是首选方法)。

答案 2 :(得分:1)

这是一种不好的做法,因为您无法确定该对象是否已完全初始化。即使你在构造函数的末尾调用start()方法,也可能导致混乱。

请注意处理器可以不按顺序执行操作:

1: MyObject(){
2:  aVariable = anyValue;
3:  this.start();
4: }

处理器可以自由地在第2行之前执行第3行,因为它们不相关(以单线程方式),因此你可能最终得到未经初始化的变量(甚至最终变量)和其他意想不到的东西。

答案 3 :(得分:0)

我建议在外面启动线程,而不是从Constructor调用。在构造函数中,您应该只进行初始化。

答案 4 :(得分:-1)

只要您启动的主题没有this的引用,那么您就可以了。如果线程确实有this的引用(通过内部类间接传递给线程),那么从构造函数启动它是一个坏主意,因为对象没有完全初始化。