3

当我尝试重新开始我的线程时出现以下错误。

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

代码可以在循环中执行多次(套接字处理程序)。据我所知,这个错误意味着它无法启动一个新线程,因为它已经在运行。奇怪的是我之前有一个 isAlive 。

知道为什么会这样吗?

谢谢。

4

5 回答 5

8

据我所知,这个错误意味着它无法启动一个新线程,因为它已经在运行。

不,这意味着您无法启动已经启动的线程。

您无法重新启动线程,这就是您正在尝试做的事情。从文档中start()

抛出: IllegalThreadStateException - 如果线程已经启动。

猜测您可能应该使用 anExecutorService代替 - 但目前还不清楚您要做什么。

于 2012-04-18T10:20:52.263 回答
2

您不能在先前已启动的线程上调用 start。即使线程运行方法已经终止。

于 2012-04-18T10:22:39.177 回答
1

您要实现的是,如果您的线程不存在,请启动它。但它在概念上是错误的。

即使您的线程不存在,您也无法调用 start 方法。如果你已经启动过一次,那么即使它已经执行完毕,你也不能再次启动它。

如果您打算重新运行一个任务,那么您可以尝试 ExecutorService。

于 2012-04-18T11:49:48.407 回答
1

Vodemki,每次有任务时创建一个新线程很昂贵。您应该使用线程池。基本上它的作用是你有一个 n 线程池并向它提交任务。如果某个线程是空闲的,它将执行您的任务。如果某个线程完成了它的任务,它就会回到池中等待其他任务。

尝试使用 ExecutorService 来池化线程。

于 2012-04-18T12:20:01.123 回答
0

我找到了最简单的方法:

每次我需要启动一个新线程时,我都会创建一个新线程:

Thread t = new Thread()
{
    public void run()
    {
        // Do your deal here
    }
};
t.start();
于 2012-04-18T12:12:59.440 回答