Java 线程只运行一次

Java 线程只运行一次,java,multithreading,exception,Java,Multithreading,Exception,当一个线程完成时,您不能使用start()方法再次运行它:它会抛出一个异常。谁能解释一下,为什么?这样一个架构决策背后的原因是什么?最终,线程会生存,然后消亡。毕竟,线程对象只是底层真实OS线程的代理。如果你想要另一个像它一样的,创建一个新的实例。不要试图复活亡灵 因为让代码在一个单独的线程中执行的方法不是创建一个线程,它链接到什么是线程的系统视图(关于绿色线程和系统线程之间的区别有很多细节),而是创建一个线程,并由线程执行 为了优化代码(因为创建线程非常耗时),我甚至建议您不要直接让线程执行R

当一个线程完成时,您不能使用start()方法再次运行它:它会抛出一个异常。谁能解释一下,为什么?这样一个架构决策背后的原因是什么?

最终,线程会生存,然后消亡。毕竟,
线程
对象只是底层真实OS线程的代理。如果你想要另一个像它一样的,创建一个新的实例。不要试图复活亡灵

因为让代码在一个单独的线程中执行的方法不是创建一个线程,它链接到什么是线程的系统视图(关于绿色线程和系统线程之间的区别有很多细节),而是创建一个线程,并由线程执行


为了优化代码(因为创建线程非常耗时),我甚至建议您不要直接让线程执行Runnable,而是让线程执行Runnable,这样您就可以使用线程池而不必担心所有这些细节。

从体系结构的角度看,如果线程从未完成,你必须任意杀死它以阻止它执行

如果希望run()方法多次执行例程,请在其内部放置一个循环。您可以使用回调方法将数据/信号发送回调用线程,并在它们发生时作出反应

当线程完成时,您不能 使用start()再次运行它 方法:

更正:每个实例只能调用一次
Thread.start()
,任何后续调用都将抛出异常,无论线程是否仍在运行


在完成运行后允许“重启”(当线程仍在运行时,这显然是一个错误)将需要额外的逻辑,并将阻止运行时释放线程堆栈之类的资源(这是一个相当大的内存量),直到实例被垃圾回收;按照现在的方式,这些线程可以在线程完成后立即释放。

创建多个线程的简单实现:

import java.io.*;

class PWD extends Thread {
   public void run() {
   System.out.println(System.getProperty("user.dir"));
   return;
   }
}
public class HelloMultithread extends Thread{
   public static void main(String[] args) throws java.io.IOException {
      for(int i = 0; i < 10; i++){
      PWD p = new PWD();
      p.start();
      }
   } 
}
import java.io.*;
类PWD扩展线程{
公开募捐{
System.out.println(System.getProperty(“user.dir”);
返回;
}
}
公共类HelloMultithread扩展线程{
公共静态void main(字符串[]args)引发java.io.IOException{
对于(int i=0;i<10;i++){
PWD p=新PWD();
p、 start();
}
} 
}
作为新手,此链接有助于:


是的!ExecutorService是狗屎,它还可以处理阻塞队列。我不想知道,如何解决这个问题,我只想知道,为什么。