错误Java异常java.lang.IllegalThreadStateException

时间:2014-03-31 10:46:13

标签: java multithreading

在Java中我得到了这个例外:

线程“main”中的异常java.lang.IllegalThreadStateException

这是代码:

class Worker extends Thread
{
   public void run() {
   System.out.println("#");
 }
}

class Seconda extends Thread
{
   public void run() {
       System.out.println("*");
   }
}


public class First
{
   public static void main(String args[]) {
      int contatore=0;
      Worker prova = new Worker();
      Seconda prova2 = new Seconda();
      prova.start();
      prova2.start();
      for(;;) {
               if(!prova.isAlive()) { prova.start();
                                      contatore++;
                                    } 
           if(!prova2.isAlive()) { prova2.start();
                                   contatore++;
                                 }
           if(contatore==50) System.out.println(""); 
          }

   }
 }

例外是什么意思?

5 个答案:

答案 0 :(得分:1)

您正在尝试启动已经启动的线程。

你需要做的是在for循环中创建prova和prova2吗?

public static void main(String args[]) {
  int contatore=0;
  //Worker prova = new Worker();
  //Seconda prova2 = new Seconda();
  //prova.start();
  //prova2.start();
  for(;;) {
     Worker prova = new Worker();
     Seconda prova2 = new Seconda();
     if(!prova.isAlive()) { 
        prova.start();
        contatore++;
     } 
     if(!prova2.isAlive()) { 
        prova2.start();
        contatore++;
     }
     if(contatore==50) System.out.println(""); 
     }
}

答案 1 :(得分:1)

你不能多次启动一个线程。如果您多次启动一个帖子,您将获得IllegalThreadStateException

尝试,

new Thread(prova).start();
new Thread(prova).start();

如果你需要启动同一个线程。

More

答案 2 :(得分:0)

您不得多次启动线程。它只能启动一次。请参阅Thread.start()的JavaDoc:

  

多次启动线程永远不合法。

     

[..]

     

如果线程已经启动,则抛出IllegalThreadStateException。

答案 3 :(得分:0)

for(;;) {
               if(!prova.isAlive()) { prova.start();  // trying to start a started thread again
                                      contatore++;
                                    } 
           if(!prova2.isAlive()) { prova2.start();// trying to start a started thread 
                                   contatore++;
                                 }
           if(contatore==50) System.out.println(""); 
          }

   }

您应该阅读线程的生命周期。如果您尝试启动已启动的线程(它可以是活动的或其他方式),您将获得IllegalThreadStateException。请阅读线程文档

答案 4 :(得分:0)

您不能多次启动Thread,您应该创建该Thread的新实例,以便再次执行此任务。

所以你应该这样做:

if(!prova.isAlive()) {
    Worker p = new Worker();
    p.start();
    contatore++;
}

Java doc:

  

不止一次启动线程永远不合法。特别是,一旦完成执行,线程可能无法重新启动。

阅读有关Java Threads

的更多信息