我可以在同一个块中两次启动同一个线程吗?

时间:2012-10-25 07:15:22

标签: java

我在两行开始两次相同的线程,

new MyThread(0).start();
new MyThread(1).start();
我可以吗?

3 个答案:

答案 0 :(得分:6)

这些是同一类型实例,并且绝对不是同一个帖子,您可以这样做。

这种表示法可以更清楚地说明原因(虽然它与原始输出线相同):

Thread instance1 = new MyThread(0); //created one instance
Thread instance2 = new MyThread(1); //created another instance

//we have two different instances now
// let's see if that is true, or not:
System.out.println("The two threads are " + (instance1==instance2?"the same":"different"));

instance1.start(); //start first thread instance
instance2.start(); //start second instance 

//we just started the two different threads

但是,根据MyThread的实施情况,此可能会造成问题。多线程编程并非易事。线程实例应该以线程安全的方式运行,这对于保证是不容易的。

推荐阅读:Java Concurrency In Practice (Peierls, Bloch, Bowbeer, Holmes, Lea)

答案 1 :(得分:3)

正如the documentation所说,你不能多次启动一个帖子 - 如果你在一个已经启动的线程上调用start(),你将得到一个IllegalThreadStateException

但是,您的代码没有按照您的说法执行操作:您使用该代码两次启动相同的线程 - 您将创建两个单独的MyThread对象,然后启动。< / p>

答案 2 :(得分:1)

是的,因为你正在实例化两个线程。

虽然它们具有相同的类(MyThread),但每次在java中使用new关键字时,都会实例化一个新对象。此新对象无法与原始对象共享数据。您创建了两个单独的MyThread个对象;你可以开始一个而不是另一个,或者两个都开始。