当我尝试重新开始我的线程时,我收到以下错误。
Exception in thread "Thread-1" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
at com.jrat.server.Server.run(Server.java:159)
以下是该行:
if (!t.isAlive()) t.start();
代码可以在循环(套接字处理程序)中执行多次。 据我所知,这个错误意味着它无法启动新的Thread,因为它已经在运行。奇怪的是我之前有一个isAlive。
知道为什么会这样吗?
感谢。
答案 0 :(得分:8)
据我所知,此错误意味着它无法启动新线程,因为它已在运行。
不,这意味着您无法启动已经启动的线程。
你不能重新启动一个线程,这是你想要做的。来自the documentation for start()
:
抛出:IllegalThreadStateException - 如果线程已经启动。
你可能应该使用ExecutorService
而不是猜测 - 但是你真的不清楚你要做什么。
答案 1 :(得分:2)
您无法在先前已启动的线程上调用start。即使线程运行方法已经终止。
答案 2 :(得分:1)
您要实现的目标是,如果您的线程不活动,请启动它。但这在概念上是错误的。
即使您的线程不活动,也无法调用start方法。如果你已经启动过一次,即使它已经完成执行,也无法再启动它。
如果你打算做的是重新运行任务,那么你可以试试ExecutorService。
答案 3 :(得分:1)
Vodemki,每次执行任务时创建一个新线程都很昂贵。您应该使用线程池。基本上它的作用是你有一个n个线程的池,你向它提交任务。如果某个线程是空闲的,它将执行您的任务。如果某个线程完成了它的任务,它会返回池中等待其他任务。
尝试使用ExecutorService来汇集线程。
答案 4 :(得分:0)
我找到了最简单的方法:
每当我需要开始一个新线程时,我会创建一个新线程:
Thread t = new Thread()
{
public void run()
{
// Do your deal here
}
};
t.start();