Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Нужна помощь с многопоточностью / 4 сообщений из 4, страница 1 из 1
23.10.2007, 15:59:14
    #34888452
siriusP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с многопоточностью
Здравствуйте.
Просьба показать мои ошибки — при вызове Ftm.FTest.notify() наступает тишина. Просьба не сильно бить за такой код — опыта совсем нет, но хочется разобраться. Заранее спасибо.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
 public   class  Main {
   public   static   void  main(String[] args) {
    TestManaget tm =  new  TestManaget();
  }
}

 public   class  TestManaget  extends  Thread {
  MyEventObject event;
  Test FTest;
  MyListener listener;

   public  TestManaget() {
    FTest =  new  Test( this , "1");      //тест 1, ждёт события
    listener =  new  MyListener( this ); //генератор событий
    start();
  }

   public   synchronized   void  setEvent(MyEventObject aEvent) {
    event = aEvent;
  }

   public   synchronized  MyEventObject getEvent() {
     return  event;
  }

   public   synchronized   int  getEventCount() {
     if  (event ==  null )  return   0 ;  else   return   1 ;
  }

   public   synchronized   void  deleteEvent() {
    event =  null ;
  }
  
   public   void  run() {
  }
}


 public   class  MyListener  extends  Thread {
   private  TestManaget Ftm =  null ;
  
   public  IListener(TestManaget aTestManaget) {
    Ftm = aTestManaget;
    start();
  }
  
   public   void  run() {
     while  (true) {
       if  (Ftm.getEventCount() ==  0 ) { //если нет событий, создаю
         long  tmpT = java.lang.System.currentTimeMillis();
        Ftm.event =  new  MyEventObject( new   Long (tmpT).toString(), tmpT);
        System.out.println("MyEventObject created!!!"); //событие создано
         synchronized (Ftm.FTest) {
          System.out.println("Send event: " + Ftm.event.toString() + " to Test1");
          Ftm.FTest.notify(); //оповещаю !!!
        }
      }
       try  {
        sleep( 1000 );
      }  catch (InterruptedException e) {
         throw   new  RuntimeException(e);
      }
    }
  }
}


 public   class  Test  extends  Thread {
  String FName;
  TestManager Ftm =  null ; //parent

   public  Test(TestManager aTM, String aName) {
    FName = aName;
    Ftm = aTM;
    start();
  }
  
   public   void  run() {
     while (true) {
      MyEventObject tmpEvent = Ftm.getEvent(); //есть ли событие?
       while (tmpEvent ==  null ) { //нет события - жду его появления
         synchronized (Ftm.FTest) { //!!!
           try  {
            wait();  //wait и notify по одному и тому же объекту
          }  catch (InterruptedException e) {
             throw   new  RuntimeException(e);
          }
        }
      }
      System.out.println("Test #" + FName + " got event: " + tmpEvent.toString());
      Ftm.deleteEvent(FName, tmpEvent.Name);
      tmpEvent =  null ;
    }
  }
}

 public   class  MyEventObject {
   public  String Name = "";
   public   long  Number;
  
   public  MyEventObject(String aName,  long  aNumber) {
    Name = aName;
    Number = aNumber;
  }
  
   public  String toString() {
     return  Name;
  }
}
...
Рейтинг: 0 / 0
23.10.2007, 16:27:32
    #34888562
mikkri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с многопоточностью
wait(); //wait и notify по одному и тому же объекту

Здесь ошибка. Ты wait вызываешь не на том же объекте, что notify.
Кстати, обычно безопасней использовать notifyAll
...
Рейтинг: 0 / 0
23.10.2007, 16:32:30
    #34888580
siriusP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с многопоточностью
mikkriwait(); //wait и notify по одному и тому же объекту

Здесь ошибка. Ты wait вызываешь не на том же объекте, что notify.
Кстати, обычно безопасней использовать notifyAll

Почему же не на том - Ftm и в MyListener и в Test указывают на один и тот же TestManager, который в свою очередь на один и тот же FTest.
...
Рейтинг: 0 / 0
23.10.2007, 16:55:13
    #34888652
mikkri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с многопоточностью
1) Не нужно такой корявый код писать. Принцип инкапсуляции одинаков для всех языков, лучше его изучить до того, как вы начнете программировать на Java
2) Проверьте, нет ли в
synchronized(Ftm.FTest) { //!!!
NullPointerException
Вполне может быть, так как вы не синхронизируете доступ к Ftm.FTest
В качестве заплатки попробуйте синхронизироваться на this
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Нужна помощь с многопоточностью / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]