-1

我在两行上两次启动同一个线程,

new MyThread(0).start();
new MyThread(1).start();

我可以吗?

4

3 回答 3

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 并发实践(Peierls、Bloch、Bowbeer、Holmes、Lea)

于 2012-10-25T07:16:26.920 回答
3

正如文档所说,您不能多次启动一个线程 - 如果您调用start()一个已经启动的线程,您将获得一个IllegalThreadStateException.

但是,您的代码并没有按照您说的做:您没有使用该代码两次启动同一个线程 - 您正在创建两个单独的MyThread对象,您可以启动它们。

于 2012-10-25T07:20:03.517 回答
1

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

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

于 2012-10-25T07:16:48.697 回答