2016-12-08 4 views
-1

До сих пор я знал, что ждать всегда нужно знать, что нужно работать должным образом. Но когда вы попробовали приведенный ниже код, я немного смущен о работе wait и notify.I создал три потока t1, t2, t3 и передал runnable T1, T2 и T3 соответственно. Согласно мне, когда я начал три потока, только t1 должен печатать, а t2 и t3 должны перейти в состояние ожидания и продолжать ждать, поскольку никто не уведомляет.Всегда ли нужно уведомлять о работе?

Но o/p непредсказуем для меня. Пусть кто-то, пожалуйста, предложите мне немного.

package com.vikash.Threading; 

class T1 implements Runnable { 

    private State state; 

    public T1(State state) { 
     this.state=state; 
    } 

    @Override 
    public void run() { 

     synchronized (state) { 
      while(state.getState()!=1) { 
       try { 
        state.wait(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 

      synchronized (state) { 
       System.out.println(Thread.currentThread().getName()); 
       state.setState(2); 
      } 
     } 
    } 
} 

class T2 implements Runnable { 

    private State state; 

    public T2(State state) { 
     this.state=state; 
    } 

    @Override 
    public void run() { 

     synchronized (state) { 
      while(state.getState()!=2) { 
       try { 
        state.wait(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 

      synchronized (state) { 
       System.out.println(Thread.currentThread().getName()); 
       state.setState(3); 
      } 
     } 
    } 
} 

class T3 implements Runnable { 

    private State state; 

    public T3(State state) { 
     this.state=state; 
    } 

    @Override 
    public void run() { 

     synchronized (state) { 
      while(state.getState()!=3) { 
       try { 
        state.wait(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 

      synchronized (state) { 
       System.out.println(Thread.currentThread().getName()); 
       state.setState(1); 
      } 
     } 
    } 
} 

public class Sequence { 

    public static void main(String[] args) { 

     State state=new State(); 
     Thread t1=new Thread(new T1(state),"First"); 
     Thread t2=new Thread(new T2(state),"Second"); 
     Thread t3=new Thread(new T3(state),"Third"); 
     t1.start(); 
     t2.start(); 
     t3.start(); 
    } 
} 



package com.vikash.Threading; 

public class State { 

    private int state=1; 

    public int getState() { 
     return state; 
    } 

    public void setState(int state) { 
     this.state = state; 
    } 
} 

Согласно комментарий Я модифицируя мой question.The о/р, иногда я получаю первый второй и не прекращается, а иногда и первый второй третий и заканчиваются.

+1

Пожалуйста, объясните * Но o/p непредсказуем для меня * –

+0

Возможно, это не причина, но вы понимаете, что у вас есть вложенные «синхронизированные» см. Http://stackoverflow.com/a/10365261/2310289 –

ответ

2

Ваше ожидание неверно, это возможно для всех ваших потоков для печати и заканчиваются ваша программа в настоящее время написано (но это зависит от случайности)

Это зависит от того, какого поток захватывает монитор state первого использование блок synchronized, который у всех есть.

Рассмотрим этот поток:

  1. Т1 поступает в блок synchronized (state) первым. T2 и T3 ждут, чтобы ввести свои блоки synchronized (state).
  2. Т1 не ждать, как state.getState() == 1, так что вместо
  3. Т1 печатают имя нити и присваивает 2 state.state
  4. Т1 выходит из синхронизированного блока
  5. Либо Т2 или Т3 ввести их synchronized (state) блока, предположит, что Т2 (который входит один первый неопределен поведение в Java, и, скорее всего, это случайное)
  6. так Т2 не ждать, как state.getState() == 2
  7. Т2 печатает имя нити и присваивает 3 state.state
  8. T2 выходит из синхронизированного блока
  9. T3 входит в синхронизированный блок, не ждет и печатает имя потока
  10. Выполненная программа.
Смежные вопросы