好吧,我的线程只运行一次,所以我意识到我忘了将它放在一个循环中,所以我做了,把它放入while {true}循环,但它仍然只重复一次。
这是我的代码:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package snake.multiplayer;
import java.util.ArrayList;
/**
*
* @author GUIAKI
*/
public class movimentacoes implements Runnable {
Jogo jogo;
ArrayList<Player> players = new ArrayList<Player>();
int qtdadePlayers;
long lastTime;
long delay;
long millis(){
return System.currentTimeMillis() % 1000;
}
public void run(){
int i;
while(true){
if(lastTime-millis()>=delay){
for(i=0;i<qtdadePlayers;i++){
players.get(i).anda();
System.out.println("Printou");
}
jogo.repaint();
//checaColisao();
lastTime=millis();
}
}
}
}
这就是我所说的:
Mov = new movimentacoes();
Mov.players.add(0,new Player(500,500,playimg.getImage(),15));
Mov.qtdadePlayers=1;
Mov.lastTime=System.currentTimeMillis() % 1000;
Mov.delay=50;
Mov.jogo=this;
Thread t1 = new Thread(Mov);
t1.start();
最奇怪的是,如果我调试代码,如果我仍在调试它,它会重复运行。
如何让它继续运行?
答案 0 :(得分:2)
在方法中:
public void run(){
条件:
if(lastTime-millis()>=delay){
一旦运行多次,将开始获得负值,因此需要更改顺序:
if(millis()-lastTime>=delay){
比起一切正常,感谢Sotirios Delimanolis。
答案 1 :(得分:1)
不会lastTime-millis()
为负值?因为毫秒是将来时间的最后时间
将其更改为millis()-lastTime
答案 2 :(得分:0)
您的代码似乎没问题,可能会发生两件事:
1 - 对于一些重新启动线程抛出一个异常,这将中止线程
2 - 您正在运行一些旧版本的已编译代码(这可能是因为调试版本可能与发布版本不同)
尝试清理并重建项目。
答案 3 :(得分:0)
您要做的是定期调用Runnable并执行它。你可以让一个线程在循环中无限运行并检查时间,但是这个模型通过询问时间(实际上是100%CPU)浪费了大量的CPU时间,即使你包含Thread.sleep()
也不能保证它按时醒来。更好的方法是以固定的速率安排任务。 Java可以使用ScheduledExecutorService。
在您的情况下,run方法变为:
public void run(){
for(int i=0;i<qtdadePlayers;i++){
players.get(i).anda();
System.out.println("Printou");
}
jogo.repaint();
}
然后你需要在这样的Executor中安排它:
final ScheduledExecutorService executor = Executors.newScheduledThreadPool(NUM_THREADS); // 1 threads is probably enough for your case
// ...
executor.scheduleAtFixedRate(new Movimentacoes(), 0, delay, TimeUnit.MILLISECONDS);
要在程序终止后停止Runnable,请致电executor.shutdown()
。在此调用之后,当前正在进行的任何Runnables将收到中断的状态,并且不会安排其他呼叫。一旦所有当前仍在运行的Runnables完成了他们的run方法,该程序最终将终止。因此,如果您的代码需要一段时间,您可能需要查询Thread.interrupted()
。