如何让线程在java中睡眠特定的时间?

时间:2010-09-26 13:20:17

标签: java multithreading sleep

我有一个场景,我希望线程在特定的时间内休眠。

代码:

    public void run(){
        try{
            //do something
                     Thread.sleep(3000);
//do something after waking up
                }catch(InterruptedException e){
                // interrupted exception hit before the sleep time is completed.so how do i make my thread sleep for exactly 3 seconds?
                }
        }

现在我如何处理我试图运行的线程在完成睡眠之前被中断的异常命中的情况?线程在被中断后会被唤醒并且它是否会进入可运行状态,或者只有在它进入runnable之后它才会进入catch块?

5 个答案:

答案 0 :(得分:10)

当你的线程被中断击中时,它将进入InterruptedException catch块。然后,您可以检查线程花费多长时间睡眠并计算出睡眠时间。最后,不要吞下异常,最好还是恢复中断状态,以便调用堆栈上方的代码可以处理它。

public void run(){

    //do something

    //sleep for 3000ms (approx)     
    long timeToSleep = 3000;
    long start, end, slept;
    boolean interrupted;

    while(timeToSleep > 0){
        start=System.currentTimeMillis();
        try{
            Thread.sleep(timeToSleep);
            break;
        }
        catch(InterruptedException e){

            //work out how much more time to sleep for
            end=System.currentTimeMillis();
            slept=end-start;
            timeToSleep-=slept;
            interrupted=true
        }
    }

    if(interrupted){
        //restore interruption before exit
        Thread.currentThread().interrupt();
    }
}

答案 1 :(得分:1)

  1. 根据我的经验使用Sleep通常是为了弥补计划中其他地方的不良时间,重新考虑!
  2. 试试这个:

    public void run(){
            try{
                //do something
                long before = System.currentTimeMillis();
                Thread.sleep(3000);
                //do something after waking up
            }catch(InterruptedException e){
                long diff = System.currentTimeMillis()-before;
                //this is approximation! exception handlers take time too....
                if(diff < 3000)
                    //do something else, maybe go back to sleep.
                    // interrupted exception hit before the sleep time is completed.so how do i make my thread sleep for exactly 3 seconds?
            }
    }
    
  3. 如果你自己不打扰睡眠,为什么这个线程会被唤醒?似乎你做的事情非常错误......

答案 2 :(得分:1)

根据this page,您必须对其进行编码才能按照您想要的方式行事。使用睡眠上方的线程将被中断,您的线程将退出。理想情况下,您将重新抛出异常,以便启动线程时可以采取适当的操作。

如果您不希望这种情况发生,您可以将整个事情放在一个while(true)循环中。现在,当中断发生时,睡眠中断,你吃异常,然后循环开始新的睡眠。

如果你想完成3秒的睡眠,你可以通过比较10次300毫秒的睡眠来近似它,并将循环计数器保持在while循环之外。当你看到中断时,吃掉它,设置一个“我必须死”的标志,然后继续循环,直到你睡得足够。然后以受控方式中断线程。

这是一种方式:

public class ThreadThing implements Runnable {
    public void run() {
        boolean sawException = false;
        for (int i = 0; i < 10; i++) {
            try {
                //do something
                Thread.sleep(300);
                //do something after waking up
            } catch (InterruptedException e) {
                // We lose some up to 300 ms of sleep each time this
                // happens...  This can be tuned by making more iterations
                // of lesser duration.  Or adding 150 ms back to a 'sleep
                // pool' etc.  There are many ways to approximate 3 seconds.
                sawException = true;
            }
        }
        if (sawException) Thread.currentThread().interrupt();
    }
}

答案 3 :(得分:1)

你为什么要睡3秒钟?如果只是在一段时间后执行某些操作,请尝试使用Timer

答案 4 :(得分:1)

我这样使用它:

因此没有必要等待特定时间结束。

public void run(){

    try {

        //do something

        try{Thread.sleep(3000);}catch(Exception e){}

        //do something

    }catch(Exception e){}

}