powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Нужна помощь с многопоточностью
4 сообщений из 4, страница 1 из 1
Нужна помощь с многопоточностью
    #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
Нужна помощь с многопоточностью
    #34888562
mikkri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wait(); //wait и notify по одному и тому же объекту

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

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

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


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