我在两行上两次启动同一个线程,
new MyThread(0).start();
new MyThread(1).start();
我可以吗?
这些是相同类型的不同实例,而且绝对不是同一个线程,你可以这样做。
这种表示法可以更清楚地说明原因(尽管除了输出线之外它与原始符号等效):
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
,这可能会带来问题。多线程编程并不容易。线程实例应该以线程安全的方式运行,这对保证来说并非易事。
正如文档所说,您不能多次启动一个线程 - 如果您调用start()
一个已经启动的线程,您将获得一个IllegalThreadStateException
.
但是,您的代码并没有按照您说的做:您没有使用该代码两次启动同一个线程 - 您正在创建两个单独的MyThread
对象,您可以启动它们。
是的,因为您正在实例化两个线程。
尽管它们具有相同的类 ( MyThread
),但每次new
在 java 中使用关键字时,都会实例化一个新对象。这个新对象不能与原始对象共享数据。您已经创建了两个单独的MyThread
对象;你可以开始一个而不是另一个,或者两个都开始。