我在两行开始两次相同的线程,
new MyThread(0).start();
new MyThread(1).start();
我可以吗?
答案 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
个对象;你可以开始一个而不是另一个,或者两个都开始。