Я получаю исключение при использовании потока.спать (x) или ждать()
Я попытался задержать - или усыпить-мою программу Java, но произошла ошибка.
Я не могу использовать Thread.sleep(x)
или wait()
. Появляется то же сообщение об ошибке:
незарегистрированное исключение java.ленг.Выдачей InterruptedException; должны быть пойманы или как объявляют, были брошены.
требуется ли какой-либо шаг перед использованием Thread.sleep()
или wait()
методами?
13 ответов:
у вас впереди много чтения. От ошибок компилятора через обработку исключений, потоковую обработку и прерывания потока. Но это будет делать то, что вы хотите:
try { Thread.sleep(1000); //1000 milliseconds is one second. } catch(InterruptedException ex) { Thread.currentThread().interrupt(); }
как другие пользователи сказали, что вы должны окружить свой вызов с
try{...} catch{...}
блок. Но поскольку Java 1.5 был выпущен, есть класс TimeUnit, который делает то же самое, что и нить.сна(МС) но это более удобно. Вы можете выбрать единицу времени для работы во сне.try { TimeUnit.NANOSECONDS.sleep(100); TimeUnit.MICROSECONDS.sleep(100); TimeUnit.MILLISECONDS.sleep(100); TimeUnit.SECONDS.sleep(100); TimeUnit.MINUTES.sleep(100); TimeUnit.HOURS.sleep(100); TimeUnit.DAYS.sleep(100); } catch (InterruptedException e) { //Handle exception }
также он имеет дополнительные методы: TimeUnit Oracle Documentation
посмотреть на этом прекрасном кратком посте о том, как сделать это правильно.
по сути: ловить
InterruptedException
. Помните, что вы должны добавить этот catch-блок. Сообщение объясняет это немного дальше.
используйте следующую конструкцию кодирования для обработки исключений
try { Thread.sleep(1000); } catch (InterruptedException ie) { //Handle exception }
положить
Thread.sleep
в блоке try catchtry { //thread to sleep for the specified number of milliseconds Thread.sleep(100); } catch ( java.lang.InterruptedException ie) { System.out.println(ie); }
при использовании Android (единственный раз, когда я использую Java) я бы рекомендовал использовать обработчик вместо того, чтобы переводить поток в спящий режим.
final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { Log.i(TAG, "I've waited for two hole seconds to show this!"); } }, 2000);
Ссылка:http://developer.android.com/reference/android/os/Handler.html
попробуйте это:
try{ Thread.sleep(100); }catch(Exception e) { System.out.println("Exception caught"); }
мои способы добавить задержку в программу Java.
public void pause1(long sleeptime) { try { Thread.sleep(sleeptime); } catch (InterruptedException ex) { //ToCatchOrNot } } public void pause2(long sleeptime) { Object obj = new Object(); if (sleeptime > 0) { synchronized (obj) { try { obj.wait(sleeptime); } catch (InterruptedException ex) { //ToCatchOrNot } } } } public void pause3(long sleeptime) { expectedtime = System.currentTimeMillis() + sleeptime; while (System.currentTimeMillis() < expectedtime) { //Empty Loop } }
Это для последовательной задержки, но для задержки цикла обратитесь к Java Delay / Wait.
public static void main(String[] args) throws InterruptedException { //type code short z=1000; Thread.sleep(z);/*will provide 1 second delay. alter data type of z or value of z for longer delays required */ //type code }
например:-
class TypeCasting { public static void main(String[] args) throws InterruptedException { short f = 1; int a = 123687889; short b = 2; long c = 4567; long d=45; short z=1000; System.out.println("Value of a,b and c are\n" + a + "\n" + b + "\n" + c + "respectively"); c = a; b = (short) c; System.out.println("Typecasting..........."); Thread.sleep(z); System.out.println("Value of B after Typecasting" + b); System.out.println("Value of A is" + a); } }
более простой способ подождать-это использовать
System.currentTimeMillis()
, который возвращает количество миллисекунд с полуночи 1 января 1970 UTC. Например, чтобы подождать 5 секунд:public static void main(String[] args) { //some code long original = System.currentTimeMillis(); while (true) { if (System.currentTimeMillis - original >= 5000) { break; } } //more code after waiting }
таким образом, вам не придется возиться с потоками и исключениями. Надеюсь, это поможет!
использовать
java.util.concurrent.TimeUnit
:TimeUnit.SECONDS.sleep(1);
спите одну секунду или
TimeUnit.MINUTES.sleep(1);
поспите минутку.
поскольку это цикл, это представляет собой неотъемлемую проблему - дрейф. Каждый раз, когда вы запускаете код, а затем спите, вы будете немного дрейфовать от запуска, скажем, каждую секунду. Если это проблема, то не используйте
sleep
.далее
sleep
не очень гибко, когда речь заходит о контроле.для выполнения задачи каждую секунду или в одна секунда задержки я бы сильно рекомендую [
ScheduledExecutorService
][1] и [scheduleAtFixedRate
][2] или [scheduleWithFixedDelay
][3].для запуска метода
myTask
каждую секунду (Java 8):public static void main(String[] args) { final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.scheduleAtFixedRate(App::myTask, 0, 1, TimeUnit.SECONDS); } private static void myTask() { System.out.println("Running"); }
Thread.sleep()
прост для начинающих и может быть подходящим для модульных тестов и доказательств концепции.но, пожалуйста НЕ НАДО использовать
sleep()
для производства кода. В конце концовsleep()
может сильно укусить вас.рекомендуется для многопоточных / многоядерных java-приложений использовать концепцию "ожидание потока". Wait освобождает все блокировки и мониторы, удерживаемые потоком, что позволяет другим потокам получить эти мониторы и продолжить работу, пока ваш поток мирно спит.
код ниже демонстрирует эту технику:
import java.util.concurrent.TimeUnit; public class DelaySample { public static void main(String[] args) { DelayUtil d = new DelayUtil(); System.out.println("started:"+ new Date()); d.delay(500); System.out.println("half second after:"+ new Date()); d.delay(1, TimeUnit.MINUTES); System.out.println("1 minute after:"+ new Date()); } }
DelayUtil
реализация:import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class DelayUtil { /** * Delays the current thread execution. * The thread loses ownership of any monitors. * Quits immediately if the thread is interrupted * * @param durationInMillis the time duration in milliseconds */ public void delay(final long durationInMillis) { delay(durationInMillis, TimeUnit.MILLISECONDS); } /** * @param duration the time duration in the given {@code sourceUnit} * @param unit */ public void delay(final long duration, final TimeUnit unit) { long currentTime = System.currentTimeMillis(); long deadline = currentTime+unit.toMillis(duration); ReentrantLock lock = new ReentrantLock(); Condition waitCondition = lock.newCondition(); while ((deadline-currentTime)>0) { try { lock.lockInterruptibly(); waitCondition.await(deadline-currentTime, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { Thread.currentThread().interrupt(); return; } finally { lock.unlock(); } currentTime = System.currentTimeMillis(); } } }
кроме того, если вы не хотите иметь дело с нитками, попробуйте этот метод:
public static void pause(int seconds){ Date start = new Date(); Date end = new Date(); while(end.getTime() - start.getTime() < seconds * 1000){ end = new Date(); } }
Он начинается, когда вы вызываете его, и заканчивается, когда прошло количество секунд.