为什么我的线程只执行一次,即使它处于无限循环中?

时间:2013-12-10 01:14:58

标签: java multithreading

好吧,我的线程只运行一次,所以我意识到我忘了将它放在一个循环中,所以我做了,把它放入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();

最奇怪的是,如果我调试代码,如果我仍在调试它,它会重复运行。

如何让它继续运行?

4 个答案:

答案 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()