【问题标题】:Why is run() getting called just once?为什么 run() 只被调用一次?
【发布时间】:2011-12-31 22:59:51
【问题描述】:

考虑这个类,AnimationThread

class AnimationThread implements Runnable {
    public void pause() {
        doAnimation = false;
    }

    public void doStart(){
        doAnimation = true;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        if (doAnimation) {
            //my code
        }

        try {
            Thread.sleep(500);
        } 
        catch (InterruptedException e) {

        }
    }
}

现在我在 onCreate 的一个活动中开始这个线程(只显示粗略的代码):

AnimationThread animRunnable = new AnimationThread();
animationThread = new Thread(animRunnable);
animationThread.start();

但是run() 只被调用了一次(我跟踪了一个日志以确认这一点)。我只想知道,当我启动线程时,为什么 run() 没有被重复调用 500 次睡眠。它只被调用一次。

【问题讨论】:

    标签: java android multithreading runnable


    【解决方案1】:

    run() 是任何Thread 只执行一次的方法。因为完成后run method 线程是dead or completed
    所以对于一个线程运行只会执行一个。如果你不想杀死线程,那么你必须确保运行完成......

    【讨论】:

      【解决方案2】:

      当然run() 方法会被执行一次。如果要重复 run 方法中的语句,则必须使用循环。看看TimerTask - 将在指定时间或重复运行任务。

      编辑:

      1. Android - Controlling a task with Timer and TimerTask?
      2. Timer task schedule

      【讨论】:

        【解决方案3】:

        应该是这样的。

        一个线程通过执行它的 run 方法来运行(仅仅一次)。之后,它被认为是完成/死亡/完成/完成。

        如果你想循环,你必须自己做(在run方法内部),或者使用一些ExecutorService来重复调用Runnable。

        【讨论】:

        • 谢谢。我明白了逻辑。我确保在内部运行我的逻辑代码重复运行。实际上,在我的情况下,我希望 run() 为我的目的无限执行,所以我将我的逻辑包含在 run 内的 while(true) 中,并且动画基于 doAnimation 状态变量的状态发生。谢谢。
        • 这是一种常见的模式。但是,您可能希望线程最终终止以关闭程序。或者您可以为此使用守护线程。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        相关资源
        最近更新 更多