Подтвердить что ты не робот

Как сделать поток для определенного времени в java?

У меня есть сценарий, в котором я хочу, чтобы поток спал в течение определенного времени.

код:

    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?

4b9b3361

Ответ 1

Когда ваш поток попадает в прерывание, он переходит в блок catch InterruptedException. Затем вы можете проверить, сколько времени нить потратила на сон, и выяснить, сколько еще времени нужно спать. Наконец, вместо того, чтобы усвоить исключение, хорошей практикой является восстановление статуса прерывания, чтобы кодекс выше стека вызовов мог справиться с ним.

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();
    }
}

Ответ 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

В соответствии с эта страница вам придется закодировать ее так, как вы хотите. Использование потока над вашим сном будет прервано, и ваш поток выйдет. В идеале вы должны перебросить исключение, чтобы все, что началось, могло принимать соответствующие действия.

Если вы не хотите, чтобы это произошло, вы могли бы поместить все это через некоторое время (истинный) цикл. Теперь, когда прерывание происходит, сон прерывается, вы едите исключение и зацикливаетесь, чтобы начать новый сон.

Если вы хотите завершить 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();
    }
}

Ответ 4

Почему вы хотите спать ровно 3 секунды? Если вам просто нужно что-то выполнить через некоторое время, попробуйте использовать Timer.

Ответ 5

Я использую его следующим образом:

Поэтому нет необходимости ждать определенного времени до конца.

public void run(){

    try {

        //do something

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

        //do something

    }catch(Exception e){}

}