繁体   English   中英

线程只运行一次

[英]Thread runs only once

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

因为在单独的线程中执行代码的方法不是创建一个线程,该线程链接到什么是线程的系统视图(绿色和系统线程之间的区别有无穷无尽的细节),但创建一个Runnable ,和让它由一个线程执行。

对于最佳代码(因为创建线程非常耗时),我甚至建议你不要直接让一个线程执行Runnable,而是由ExecutorService执行 ,这将允许你使用一个线程池而不必烦扰所有这些细节。

线程完成后,使用start()方法无法再次运行它:

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

在运行完成后允许“重启”(当线程仍在运行时显然是错误的)将需要额外的逻辑,并且会阻止运行时释放诸如线程堆栈(这是一个大量的内存)之类的资源,直到实例是垃圾收集; 它现在的方式,一旦线程结束就可以释放。

最终,线程存在,然后它就死了。 毕竟, Thread对象只是下面真实OS线程的代理。 如果你想要另一个喜欢它,请创建一个新实例。 不要试图复活不死生物!

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

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();
      }
   } 
}

作为一个新手,这个链接有助于:

http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html

在架构意义上更糟糕的是如果线程永远不会完成,你必须任意杀死它以阻止它执行。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM