线程中的睡眠问题

时间:2013-03-26 05:04:00

标签: java android thread-sleep

点击按钮我正在调用以下功能。

private void badButtonHandler() {
    Camera.Parameters params = mCamera.getParameters();
    params.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);
    mCamera.setParameters(params);
    if(thread != null){
        thread = null;
    }
    thread = new Thread()
    {
        @Override
        public void run() {
            try {
                while(true) {
                    sleep(5000);
                    Camera.Parameters params = mCamera.getParameters();
                    params.setColorEffect(Camera.Parameters.EFFECT_NONE);
                    mCamera.setParameters(params);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };

    thread.start();
}

此功能用于在单击按钮5秒后更改相机的色彩效果。第一次按相关按钮时,其行为符合预期。但是对此函数的其他调用并不像预期的那样。即,第二次等待2秒,之后每次点击都会降低到更低的值。

2 个答案:

答案 0 :(得分:0)

你应该依赖sleep()作为准确的计时器。它不会在指定的时间自动唤醒并成为当前活动的线程,因为所有线程都受线程调度程序的支配这一简单事实。毫无疑问,基于给定的JVM,OS在操作系统之间会有所不同。

对于这些类型的场景,我一直依赖自定义计时器功能。所以,例如:

myTimer(System.nanoTime());

public static void myTimer(long startTime) {
    while (startTime + 5000000000 > System.nanoTime()) { //Wait for 5 seconds
        try {
            Thread.sleep(50); //Sleep at ~50 millisecond intervals
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

您不需要像在示例中那样创建一个全新的线程,因为Thread.sleep()会将当前线程置于休眠状态。而且,使用while(true)循环只是糟糕的编程习惯。

首选使用nanoTime(),因为它是Java中最精确的系统计时器。

有关sleep()函数不可靠性的其他信息,请参阅this documentation

答案 1 :(得分:-1)

试试这个

Thread timer = new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                //Your desired work
            }
        }
    });
    timer.start();