2015-09-18 6 views
0

Рассмотрим эту простую попытку для многопоточности, например:Thread wait() влияет на основной поток?

public class LetsMutexThreads { 

    public static Object MUTEX = new Object(); 

    private static class Thread1 extends Thread { 
     public void run() { 
      synchronized (MUTEX) 
      { 
       System.out.println("I'm thread 1 , goint to take a nap..."); 
       try 
       { 
        MUTEX.wait(); 
       } 

       catch (InterruptedException e) 
       { 
        e.printStackTrace(); 
       } 

       System.out.println("T1 : That's it , I'm done ..."); 
      } 
     } 
    } 

    private static class Thread2 extends Thread { 
     public void run() { 
      synchronized (MUTEX) 
      { 
       System.out.println("Thread 2 : Let's rock N roll !"); 
       System.out.println("Waking up my buddy T1 ..."); 
       MUTEX.notify(); 
      } 
     } 
    } 

    public static void main(String[] args) 
    { 
     Thread2 t2 = new Thread2(); 
     Thread1 t1 = new Thread1(); 
     t1.run(); 
     t2.run(); 
    } 

} 

Я пытаюсь позволить Thread1 идти спать с ожиданием, а затем пусть Thread2 использовать уведомит(), чтобы разбудить Thread1, но он Безразлично У меня есть шанс.

Почему wait() из Thread1 влияет на основную тему от выполнения t2.run();?

+4

Пожалуйста, посмотрите вверх разница между run() и start() – Arkadiy

+0

'Thread' является' Runnable' должна быть одной из самых глупых вещей в Java API. –

+0

@MarkoTopolnik: Мои потоки не реализуют Runnable. – ron

ответ

4

Вы не должны пытаться запустить поток, используя метод run(). Он фактически не создает новый поток, он запускает код в текущем потоке. Используйте Thread.start() вместо того, чтобы ваш код выполняется в отдельном (новом) нити

+1

Правильная идея, но «должно» звучит так, как будто у вызывающего есть выбор, когда на самом деле такого выбора нет. _only_ способ запуска потока - вызвать 't.start()'. –

+0

Спасибо за комментарий, я обновил свой ответ, чтобы сделать его более понятным. –

3

Это неправильно:

Thread2 t2 = new Thread2(); 
Thread1 t1 = new Thread1(); 
t1.run(); 
t2.run(); 

Изменить его к этому:

Thread2 t2 = new Thread2(); 
Thread1 t1 = new Thread1(); 
t1.start(); 
t2.start(); 
+0

Ваш первый фрагмент не _wrong_ Не сам по себе. Это неправильно, если он не выполняет то, что программист намеревался сделать. В вашем ответе ничего не говорится о намерении программиста. В вашем ответе не сказано _why_ первый пример неверен или почему второй правильный. Все, что вы здесь делаете, бросает рыбу, когда вы можете учить его, как рыбачить. –

+0

Хорошо. Правильно ли создавать объект Thread (вместо Runnable), а затем вызывать run()? Я не могу придумать никакой ситуации, когда это было бы желательно. Я надеюсь, что читатель увидит разницу в двух фрагментах кода и просмотрит документацию по двум методам, чтобы понять остальные. – dsh

+0

«Правильно», как в хорошем дизайне? Я не могу себе представить, как вызов t.run() 'мог когда-либо улучшать _design_ программы, но я могу представить это как часть дешевого, неряшливого взлома, который исправляет ошибку. Я видел хуже. Хех! Я, наверное, ошибся, и в коммерческих продуктах тоже. Что касается вашей надежды, не беспокойтесь об этом. Antonis_wrx уже дал нубу информацию, которая ему нужна. –

 Смежные вопросы

  • Нет связанных вопросов^_^