可以调用java线程对象两次

时间:2015-04-10 14:29:46

标签: java

public class GetCurrentPrice implements Runnable{
   public void run(){
      // some business logic
   }
}



public class Main{
   public static void main(){
       GetCurrentPrice gcp = new GetCurrentPrice();
       Thread t = new Thread(gcp);
       while(true){
           t.start();
           //once this thread execution is complete, restart this thread.
        }
   }
}

抛出java.lang.IllegalThreadStateException。我想要实现的是,运行此线程一次,等待它完成,一旦完成,再次运行该线程。

7 个答案:

答案 0 :(得分:5)

不,你不能这样做。来自Thread.start()API:多次启动线程永远不合法。

答案 1 :(得分:4)

来自班级java.lang.Thread

的javadoc
  

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

请参阅https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#start()

答案 2 :(得分:4)

虽然您无法直接重新运行Thread,但您可以使用ScheduledExecutorService定期执行Thread(或其他任何实现Runnable的内容)。

来自API:

  

计划方法创建具有各种延迟的任务,并返回可用于取消或检查执行的任务对象。 scheduleAtFixedRate和scheduleWithFixedDelay方法创建并执行定期运行的任务,直到被取消。

您可以创建一个包含一个帖子的池,将其交给Runnable并让它在每次完成时重新运行它,通过这样做:

public class GetCurrentPrice implements Runnable {
    public void run() {
        // some business logic
    }
}
public class Main {
    public static void main() {
        GetCurrentPrice gcp = new GetCurrentPrice();
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        // each time thread execution completes, start a new one without delay
        scheduler.scheduleAtFixedRate(gcp, 0, 0, TimeUnit.SECONDS);
    }
}

答案 3 :(得分:2)

Java中的线程不可重复使用。

尝试在Java中重新启动线程是不合法的。

答案 4 :(得分:2)

是的,同一个Thread不能多次启动,但同一个Runnable实例可以传递给不同的Thread对象。

更多信息 - > Initializing two threads with the same instance of a runnable

答案 5 :(得分:0)

不,你不能多次启动Thread,你需要在每次想要启动同一个线程时初始化新的Runnable。

答案 6 :(得分:0)

这是重复业务逻辑的一种方法:

public class GetCurrentPrice implements Runnable {
    public void run() {
        businessLogic();
        businessLogic();
    }

    public void businessLogic() {
        // some business logic
    }
}

public class Main {
    public static void main() {
        GetCurrentPrice gcp = new GetCurrentPrice();
        new Thread(gcp).start();
    }
}