Java 睡眠线程有时睡眠时间超过要求

Java 睡眠线程有时睡眠时间超过要求,java,android,multithreading,Java,Android,Multithreading,我正在调用while循环中的一个线程以休眠1秒。当该标志为true时,循环将运行(该标志在无限时间内为true)。 在循环内部,线程应该休眠1秒,唤醒并增加计数器,检查IF条件,在FALSE条件下,它应该再次休眠1秒,进程继续29次。在第30次迭代中,IF条件为true,IF语句中调用的方法将收集并存储数据。最后,在第32次迭代中,调用inside second IF语句的方法将存储的数据发送到服务器,并将计数设置为0。 问题是,有时睡眠线程睡眠时间超过1分钟,或者睡眠时间不确定。在这里找到我随

我正在调用while循环中的一个线程以休眠1秒。当该标志为true时,循环将运行(该标志在无限时间内为true)。 在循环内部,线程应该休眠1秒,唤醒并增加计数器,检查IF条件,在FALSE条件下,它应该再次休眠1秒,进程继续29次。在第30次迭代中,IF条件为true,IF语句中调用的方法将收集并存储数据。最后,在第32次迭代中,调用inside second IF语句的方法将存储的数据发送到服务器,并将计数设置为0。 问题是,有时睡眠线程睡眠时间超过1分钟,或者睡眠时间不确定。在这里找到我随附的代码

public class NetworkThread implements Runnable {
private boolean flag;

public NetworkThread(boolean bool) {
    flag = bool;
    isrunning();
}

private boolean isrunning() {
    return flag;
}

int counter = 0;

@Override
public void run() {
    sendStartPacket();
    while (flag) {
        try {
            Thread.sleep(1000);
            counter++;
            if (counter % 30 == 0) {
                // TODO Auto-generated method store an information
            }
            if (counter % 32 == 0) {
                // TODO Auto-generated method send the information to server
            }
        } catch (Exception e) {
            e.toString();
        }
    }
}

private void sendStartPacket() {
    // TODO Auto-generated method stub

}

除了代码/实现的复杂性之外,请记住Thread.sleep()将尝试睡眠,至少睡眠时间为x次,因此睡眠“更多”并不奇怪

您可以获得有关Thread.sleep()准确性的更多信息


这就是为什么你的应用程序似乎睡得太多的原因。对于无限期睡眠,我同意迈克·墨菲的意见,检查你的捕捉块

重置你的计数器!在缺少的最后一个子句中,如果(计数器>=30)

线程被中断,则重写您的检查。如果您的线程被中断,计数器没有增加,并且线程又休眠1000毫秒。这可能是您的问题的原因吗?

您的catch代码可能有问题。您只执行了一个e.toString(),它没有显示任何内容,您的异常最终被忽略。可能需要更改该设置,以将错误记录到控制台或文件中。问题的标题可能会让人对Thread.sleep的功能产生一些怀疑。请放心,Thread.sleep(1000)只会再睡1秒钟。实际上它不能保证这一点。如果线程被中断,它的睡眠时间将少于所需的时间。线程没有被中断,因此我认为这不是原因。