Java - 线程状态异常

时间:2012-04-18 10:18:44

标签: java multithreading

当我尝试重新开始我的线程时,我收到以下错误。

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。

知道为什么会这样吗?

感谢。

5 个答案:

答案 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();