线程完成后,使用start()方法不能再运行一次:它会抛出一个异常。谁能解释一下,为什么?这样的架构决定背后有什么?线程只运行一次
线程只运行一次
回答
因为在单独线程中执行代码的方式不是创建一个线程,该线程链接到什么是线程的系统视图(有关绿色和系统线程之间区别的详细信息),而是创建一个Runnable,并由线程执行。
为了获得最佳代码(因为创建线程非常耗时),我甚至会建议您不要直接让线程执行Runnable,而是使用ExecutorService,这样可以让您无需使用线程池困扰所有这些细节。
最终,线程活着,然后它死亡。毕竟,Thread
对象只是下面真实操作系统线程的代理。如果你想要另一个喜欢它,请创建一个新实例。不要试图复活亡灵!
从架构的角度来看更糟糕的是,如果线程没有完成,你必须任意杀死它以阻止它执行。
如果您希望它多次执行一个例程,请在run()方法内放置一个循环。您可以使用回调方法将数据/信号发送回调用线程,并在发生时对它们做出反应。
我不想知道,如何解决这个问题,我只想知道,为什么。 – folone 2010-04-22 08:21:59
当一个线程完成后,你不能 来看,这一次,使用的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();
}
}
}
作为newbee,这个链接帮助:
http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html
- 1. C线程只运行一次
- 2. 为什么线程只运行一次?
- 3. 运行一次线程10000次
- 4. 只能在线程/循环中运行一次
- 5. Java日程只运行一次
- 6. Laravel调度程序只运行一次
- 7. POSIX线程 - 只做一次
- 8. 只运行一次javascript命令一次
- 9. 只运行一次js文件一次
- 10. Spring ThreadPoolTaskExecutor只运行一个线程
- 11. Android只能运行一次运行
- 12. Java Timer.schedule只运行一次
- 13. jQuery:只运行一次
- 14. Else Loop只运行一次
- 15. Nodejs async.whilst()只运行一次
- 16. OnClick只运行一次
- 17. 循环只运行一次
- 18. setTimeOut/setInterval只运行一次
- 19. .scroll()只运行一次
- 20. RestKit - RKObjectMapping只运行一次
- 21. 事件只运行一次
- 22. javascript只运行一次
- 23. VBA只运行宏一次
- 24. 函数只运行一次
- 25. CLLocationManager只能运行一次
- 26. Javascript setInterval只运行一次
- 27. IndicatingAjaxButton只能运行一次
- 28. NSTimer只运行一次
- 29. JavaScript setInterval只运行一次
- 30. ScheduledThreadPoolExecutor只运行Swingworker一次
是的! ExecutorService是狗屎,它也可以处理BlockingQueue。 – 2010-04-22 08:10:25