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。我想要实现的是,运行此线程一次,等待它完成,一旦完成,再次运行该线程。
答案 0 :(得分:5)
不,你不能这样做。来自Thread.start()API:多次启动线程永远不合法。
答案 1 :(得分:4)
来自班级java.lang.Thread
不止一次启动线程永远不合法。特别是,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();
}
}