Каково различие между wait () и sleep () в Java?

В моем приложении я манипулирую различными трэдами, которые должны "спать" X секунд. Я ощутился, что используя оба метода трэд он спит.

Различие - что с Thread.sleep(5000); я сплю главный трэд и с hilo.wait() я могу заставлять спать любой другой созданный трэд? Я нахожусь в правильном? Если это не будет так, я буду благодарен много за Ваши объяснения.

26
задан 12.02.2017, 17:53
4 ответа

Это различия между sleep (int milis) и wait (int milis)

Tabla diferencias entre sleep y wait

wait() без параметра milis он ведет себя exáctamente как будто он просто звонил в wait(0)

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

Очень важное различие они ты разбудишь те внебрачные. Которые затрагивают в wait но не в sleep. Один wait смоги заканчиваться в любом моменте, без мотива и оправдания, и это ответственность программиста иметь это в виду.

В котором они равны, он, в котором оба спят в трэд, в котором работал вызов в wait или sleep. Ни один не служит для того, чтобы спать в главный трэд (кроме, если они работают в главном трэде).

Заключение:

Используй sleep, чтобы ждать время.
wait - для другой вещи (синхронизации) и страдают despertares внебрачные.

Код демонстрация я использую CPU

В моей машине он работает за 10-13 секунд так с USAR_SLEEP в true как в false.

class Test extends Thread {

    static final boolean USAR_SLEEP = false;
    static final int NUM_THREADS = 20000;

    public static void main(String[] args) throws InterruptedException {
            Test[] thread = new Test[NUM_THREADS];
            for (int n = 0; n < NUM_THREADS; ++n) {
                thread[n] = new Test();
                thread[n].start();
            }
            int m = 0;
            for (int n = 0; n < 100000000; ++n) {
                m = m * 23 + n;
            }
            if ( !USAR_SLEEP )
            {
                for ( Test t : thread )
                {
                    synchronized( t.cerrojoImplicito )
                    {
                        t.cerrojoImplicito.notify();
                    }
                }
            }
            for (Test t : thread) {
                t.join();
            }
    }

    public Object cerrojoImplicito = new Object();
    public void run() {
        try {
            if (USAR_SLEEP) {
                sleep(5000);
            } else {
                synchronized (cerrojoImplicito) {
                    cerrojoImplicito.wait(5000);
                }
            }
        } catch (InterruptedException ex) {
            System.out.println("Interrumpido");
        }
    }
}
17
ответ дан 01.12.2019, 08:14
  • 1
    Спасибо уважаемый, превосходный colaboraci и # 243; n. – HCarrasko 19.12.2015, 03:28

Один wait смоги быть "разбуженным" другим процессом звоня notify в мониторе, который обслужен, в то время как один sleep нет. Также waitnotify) будь должен происходить в блоке synchronized на объекте монитора в то время как sleep нет.

Object mon = ...;
synchronized (mon) {
    mon.wait();
} 

В этой точке, трэд, который работает в настоящее время, ждет и освобождает монитор. Другой трэд может делать:

synchronized (mon) { 
     mon.notify(); 
}

(В том же объекте mon ) и первый трэд (предполагая, что это единственный трэд в резерве в мониторе) может просыпаться.

Существует вопрос с большим количеством ответов на английском: https://stackoverflow.com / questions / 1036754/difference-between-wait-and-sleep ответ, осуществленный пользователем oxbow-lakes (это, чтобы уважать лицензию SO)

8
ответ дан 01.12.2019, 08:14
  • 1
    если, я вижу, что ты скопировал и прикрепил ответ xD, но спасибо за твою помощь. – HCarrasko 18.12.2015, 21:56
  • 2
    Это удовольствие, много informaci и # 243; n он находится в настоящее время в StackOverflow, возможно помогать переводить, чтобы отвечать ее aqu и # 237; привет. – Jorgesys♦ 18.12.2015, 22:20
  • 3
    Подсказка: в и # 241; ade ты разбудишь их esp и # 250; преступники, это очень важное различие между sleep и wait. – Jose Antonio Reinstate Monica 18.12.2015, 23:06

wait() это не метод, чтобы ждать время, это часть примитивной одной синхронизации.

Примитивная синхронизации в вопросе, это мониторы. Монитор, главным образом - еще один mútex переменная условия.

В Java, у каждого объекта есть монитор. Приобретается mútex монитора с synchronized(objeto) {, и mútex освобожден, когда он заканчивает блок кода, с корреспондентом }.

Пока приобретен mútex, могут делаться операции с переменной подходящего условия:

  • Возможно надеяться на то, что случается условие:

    while (!condicion) { objeto.wait(); }

    Перед тем, как помещать трэд в резерве, освобожден mútex, для того, чтобы другие трэды смогли реализовывать операции с переменной условия. Когда он просыпается, попробуй повторно приобретать mútex.

  • Возможно сообщать, что случилось условие, прося, чтобы проснулся один из трэдов в резерве:

    objeto.notify();

  • Возможно сообщать, что случилось условие, прося, чтобы разбудили все трэды в резерве:

    objeto.notifyAll();

Пример был бы очередью с производящим трэдом, и потребляющим трэдом. Очередь защитилась бы с монитором. Потребитель пошел бы desencolando элементы, если бы эта пустая очередь, он начал ждать с одним wait(). Производитель добавил бы элементы к очереди, сообщая возможным потребителям, что очередь уже не является пустой.

Когда он ожидается, с которым произошло условие, важно подтверждать условие в цикле.

7
ответ дан 01.12.2019, 08:14
  • 1
    Подсказка: в и # 241; ade ты разбудишь их esp и # 250; преступники, это очень важное различие между sleep и wait – Jose Antonio Reinstate Monica 18.12.2015, 23:00

В случае Thread.sleep() не главный трэд, который проваливается, а настоящий, а именно тот, который выполняет именно эту линию кода.

В случае wait() он не в трэд, в который он делается wait а в объект, который служил бы для синхронизации.

Перегрузка, о которой ты упоминаешь метода wait() будь определен в классе Object так

public final void wait() throws InterruptedException

Вызови the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object. In other words, this method behaves exactly эксперт if it simply performs the call wait(0).

Перевод:

Он способствует тому, чтобы настоящий трэд ждал до тех пор, пока другой трэд не призовет метод notify() или notifyAll() в этом объекте. В других словах он ведет себя точно как будто он назвался в wait(0).

Следовательно единственный способ обобщать выполнение трэда (с этой перегрузкой, так как есть другая, которую ты перемещаешь timeout) состоит в том, чтобы использовать Object.notify или Object.notifyAll.

Если ты нуждаешься в том, чтобы отменить трэд до тех пор, пока другой это не разбудит, ты можешь использовать object.wait() , если ты взамен хочешь отменить трэд в течение специфического времени, используй Thread.sleep(), нужно упоминать о том, что один Thread.sleep не моги быть сообщенным для reaunudar, из-за того, что ты всегда будешь должен надеяться на то, что timout заканчивается.

4
ответ дан 01.12.2019, 08:14
  • 1
    @EdwinDalorzo не sab и # 237; в который sleep () тратит ресурсы. Он думал, что dorm и # 237; в на уровне операционной системы. – ArturoTena 18.12.2015, 22:51
  • 2
    @EdwinDalorzo sleep () у него нет из-за qu и # 233; тратить ресурсы. Ничего нет в descripci и # 243; n чиновник sleep (), что сказал, что он тратит ресурсы. Что завершает их или не зависит этого оптимизированная, что est и # 233; м и # 225; виртуальная хина Java. V и # 233; поджарьте c и # 243; я говорю моего ответа как demostraci и # 243; n. – Jose Antonio Reinstate Monica 18.12.2015, 22:56
  • 3
    @EdwinDalorzo, если sleep(5000) занимал CPU в течение 5 секунд, не позволяя сделать м совсем не и # 225; s в CPU тогда моя программа, которая бросает 20000 sleeps конкурирующие в 5 секунд каждый опаздывать и # 237; в м и # 225; s 27 часов, в м работает в одной и # 225; хина 4 n и # 250; cleos. Но опоздай 10-13 секунд. Ты можешь видеть an и # 225; lisis функционирования sleep в javamex.com/tutorials/threads/sleep.shtml – Jose Antonio Reinstate Monica 19.12.2015, 09:14
  • 4
    @Antonio у Тебя Есть raz и # 243; n. У меня был comprensi и # 243; n спутанная тогда. Твой ответ это показывает превосходно. Я извиняюсь за confusi и # 243; n спровоцированная. И upvotes случая – Edwin Dalorzo 19.12.2015, 15:17