为什么我们不能在Thread对象的同一个实例上调用start方法两次?

我正在阅读有关线程的文章,发现我们无法在同一个线程实例上调用两次start方法。 但我不明白同样的确切原因。 那么为什么我们不能称之为两次甚至更多次呢?

在我看来,Thread对象是实际运行上下文的“句柄”。 如果允许创建与同一java.lang.Thread关联的许多并发执行,那么您期望getStackTrace()和getState()方法返回什么?

我认为Thread类可以设计为允许产生多个运行的上下文,但它的API不那么简单和干净。

你想要1个实例用于1个线程,因为该线程具有它将管理的内部状态。

将线程视为一种资源。 让1个实例引用多个资源通常是没有意义的 – (就像你不能让java文件对象引用多个文件一样)。

如果你开始一个线程两次,它也会让你遇到各种各样的麻烦,你要么从Threadinheritance而且做了一些现在多于1个线程访问的实例变量, – 如果你从Runnable创建线程也是如此。 Atleast API并不能让这个搞砸了。

看一下线程所处的状态,这里http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.State.html

基本上,您可以启动线程的唯一时间是它处于NEW状态。 其他任何州都无法将其转变为NEW

根据线程生命周期,一旦线程’死’你就无法重启它。你只能启动新线程调用start()方法。

线程可以从Runnable状态而不是Dead状态购买到Running状态。

Thread与线程不同。

(little-t)线程是代码的独立执行。 (Big-T) Thread是一个Java对象,可用于启动和管理一个小线程的生命周期。

假设您被雇用为保险公司编写代码,并且您定义了一个(Big-A) Accident类来代表(小)事故。 有人问你,“为什么我不能重新使用Accident实例?”

那么,事故只能发生一次,对吗? 即使完全相同的事情发生在完全相同的司机和汽车在同一天完全相同的方式,它仍然是一个不同的事故,对吧?

这是我的看法,这是由于线程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。