我正在阅读线程,发现我们无法在同一个线程实例上调用两次start方法。但我不明白同样的确切原因。那么为什么我们不能称之为两次甚至更多次呢?
答案 0 :(得分:10)
在我看来,Thread对象是实际运行上下文的“句柄”。如果允许创建与同一java.lang.Thread关联的许多并发执行,那么您期望getStackTrace()和getState()方法返回什么?
我认为Thread类可以设计为允许产生多个运行的上下文,但它的API不那么简单和干净。
答案 1 :(得分:5)
您需要1个实例用于1个线程,因为该线程具有将管理的内部状态。
将线程视为一种资源。让1个实例引用多个资源通常是没有意义的 - (就像你不能让java文件对象引用多个文件一样)。
如果你开始一个线程两次,它也会让你遇到各种各样的麻烦,你要么从Thread
继承而且做了一些现在多于1个线程访问的实例变量, - 如果你创建了来自Runnable
的主题。 Atleast API并不能让你搞砸了。
在这里查看一个主题所处的状态http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.State.html
基本上,只有当它处于NEW
状态时才能启动一个线程。并且没有其他州可以将其转换回NEW
答案 2 :(得分:1)
module ActiveRecord
class Base
private
def touch_self(obj)
obj.touch && self.touch
end
end
end
与线程不同。
(little-t)线程是您的代码的独立执行。 (Big-T)Thread
是一个Java对象,可用于启动和管理小t线程的生命周期。
假设您被雇用为保险公司编写代码,并且您定义了一个(Big-A)Thread
类来表示(小)事故。有人问你,“为什么我不能重新使用Accident
实例?”
嗯,事故只能发生一次,对吗?即使完全相同的事情发生在完全相同的司机和汽车在同一天完全相同的方式,它仍然是一个不同的事故,对吗?
答案 3 :(得分:1)
根据线程生命周期,一旦线程'死'你就无法重启它。你只能启动新线程调用start()方法。
线程可以从 Runnable 状态购买运行状态,而不是从 Dead 状态购买。
答案 4 :(得分:1)
这是我的观点,这是由于线程ID。线程调度程序通过线程ID识别线程。这是唯一的实数。请在下面找到代码,
public class StartTwice extends Thread {
public void run() {
System.out.println("running...");
}
public static void main(String[] args) {
StartTwice start1 = new StartTwice();
System.out.println("Thread id: " + start1.getId());
start1.start();
start1 = new StartTwice();
System.out.println("Thread id: " + start1.getId());
start1.start();
}
}
Output is:
Thread id: 10
Thread id: 11
running...
running...
当我重新实例化start1对象时。创建新的线程ID。
PS:即使一个线程完成,我们也不能第二次使用相同的对象(线程id)。 直到或除非JVM重用该id。