Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / многопоточное программирование: поделитесь опытом / 25 сообщений из 27, страница 1 из 2
06.07.2006, 14:41
    #33835731
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
Всем привет.

Коллеги, поделитесь плз опытом. Как можно решить такую задачу?

Допустим имеем три класса: Wizard.java, Speaker.java и Worker.java. Все классы реализуют шаблон singelton.
Задача Wizard заключается в том, чтобы создать объект Speaker. Эту задачу он выполняет в своем потоке (следовательно Wizard и Speaker существуют в одном потоке).
Задача объекта Speaker заключается в том, чтобы сообщить свой хешКод. Хеш-код нужно видеть для того, чтоб убедиться в том, что мы имеем дело действительно с объектом, созданным Wizard.
Спустя какое-то время мы запускаем Workerа из другого потока. Задача Workerа заключается в том, чтобы принудить объект Speaker, который создал Wizard, сказать заветное слово..

Повторю вопрос: не ясно, как обратиться к уже созданому объекту Speaker из другого потока (потока Workerа)? Точнее это как бы ясно, но хеш код этой Speaker отличается от того который был создан «Wizard». Это говорит о том, что мы имеем дело с совершенно другим Speaker.

Вот работа класса Wizard.java:
Код: plaintext
1.
2.
3.
4.
5.
Thread ID  1 
I am a Speaker, my hashCode is  32942009 

 Try  asks the Woker about a speaker ! 
Press [Enter] to stop
Вот работа класса Worker.java:

Код: plaintext
1.
2.
Thread ID  10 
I am a Speaker, my hashCode is  11807935 

я прицепил исходники к сообщению
...
Рейтинг: 0 / 0
06.07.2006, 15:17
    #33835899
Shkel Eugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
getInstance нужно сделать synchronized
либо синхронизировать по объекту класса

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 public   class  MySingleton{
 private   static  mySingleton;
 private  MySingleton() {
}
 public   static  MySingleton getInstance() {
   synchronized  (MySingleton) {
   if (mySingleton== null ) {
   mySingleton =  new  MySingleton();
  }
 }
  return  mySingleton;
}
}
...
Рейтинг: 0 / 0
06.07.2006, 15:18
    #33835904
Shkel Eugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
да, забыл
Код: plaintext
1.
 synchronized  (MySingleton. class  )
...
Рейтинг: 0 / 0
06.07.2006, 15:27
    #33835940
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
неясно че надо, скорее всего требуется ThreadLocal.
...
Рейтинг: 0 / 0
06.07.2006, 15:30
    #33835958
Jozic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
Shkel EugenegetInstance нужно сделать synchronized
либо синхронизировать по объекту класса

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 public   class  MySingleton{
 private   static  mySingleton;
 private  MySingleton() {
}
 public   static  MySingleton getInstance() {
   synchronized  (MySingleton) {
   if (mySingleton== null ) {
   mySingleton =  new  MySingleton();
  }
 }
  return  mySingleton;
}
}
http://www.sql.ru/forum/actualthread.aspx?tid=297819
...
Рейтинг: 0 / 0
06.07.2006, 15:45
    #33836031
Jozic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
Timmнеясно че надо, скорее всего требуется ThreadLocal.ThreadLocal позволяет хранить локальный зависимый от конкретно потока объект
public class ThreadLocal<T>...
* This class provides thread-local variables. These variables differ from
* their normal counterparts in that each thread that accesses one (via its
* <tt>get</tt> or <tt>set</tt> method) has its own, independently initialized
* copy of the variable. <tt>ThreadLocal</tt> instances are typically private
* static fields in classes that wish to associate state with a thread (e.g.,
* a user ID or Transaction ID).
...
...
Рейтинг: 0 / 0
06.07.2006, 16:06
    #33836136
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
Jozic Timmнеясно че надо, скорее всего требуется ThreadLocal.ThreadLocal позволяет хранить локальный зависимый от конкретно потока объект
public class ThreadLocal<T>...
* This class provides thread-local variables. These variables differ from
* their normal counterparts in that each thread that accesses one (via its
* <tt>get</tt> or <tt>set</tt> method) has its own, independently initialized
* copy of the variable. <tt>ThreadLocal</tt> instances are typically private
* static fields in classes that wish to associate state with a thread (e.g.,
* a user ID or Transaction ID).
...
я это знаю :)
не въехал че надо от этих классов.
...
Рейтинг: 0 / 0
06.07.2006, 17:47
    #33836536
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
Shkel Eugeneда, забыл
Код: plaintext
1.
 synchronized  (MySingleton. class  )


спасибо всем кто откликнулся.
К сожалению исправления не помогли. Я прицепил новый вариант к сообщению вместе с jar архивом.
Мне кажется я не совсем ясно изложил мысль. Мне надо создав объект в одном потоке, дотянутся до этого объекта из другого потока. Я дополнил метод getInstance() класса
Speaker синхронизованным блоком synchronized(Speaker.class){...} В новую версию я так же воткнул хештаблицу, записал в нее моего Speaker и сериализовал хештаблицу в файл "myHashTable". Т.е вы обнаружите на "d:" новый файл "myHashTable" - результат работы класса Wizard. Если теперь из другой консоли запустить класс Worker, то он выдаст два значения: одно прочитает из файла "myHashTable", а другое получит от теперь уже синхронизированного блока метода getInstance(). И результат будет как говорится на "лицо" – два совершенно разных значения.
Где собака зарыта ?
...
Рейтинг: 0 / 0
06.07.2006, 18:15
    #33836622
Jozic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
kadet
у вас
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
     public   static  Speaker getInstance() {
         synchronized  ( Speaker. class  ) {
             if  ( speaker ==  null  ) {
                 return   new  Speaker();
            }
        }
         return  speaker;
    }
а должно быть
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
     public   static  Speaker getInstance() {
         synchronized  ( Speaker. class  ) {
             if  ( speaker ==  null  ) {
                speaker =  new  Speaker();
            }
        }
         return  speaker;
    }
...
Рейтинг: 0 / 0
06.07.2006, 18:23
    #33836644
Jozic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
kadetЯ дополнил метод getInstance() класса
Speaker синхронизованным блоком synchronized(Speaker.class){...} Этого не хватит, смотрите ссылку, которую я давал выше
...
Рейтинг: 0 / 0
06.07.2006, 19:11
    #33836774
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
Jozic
а должно быть
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
     public   static  Speaker getInstance() {
         synchronized  ( Speaker. class  ) {
             if  ( speaker ==  null  ) {
                speaker =  new  Speaker();
            }
        }
         return  speaker;
    }

огромное спасибо за замечание. я действительно это проглядел по запарке.
Я непременно сейчас же буду изучать Вашу ссылку. Сейчас же хочу заметить следующее:
после исправления я создал класс и в его методе main запустил последовательно оба класса: Wizard и Worker. Оба отработали правильно и дали один и тот же хеш код для Speaker.
Однако почему то когда я запустил по отдельности сначало класс Wizard а потом в ДЕББУГЕ прошел класс Worker, то Worker дал другой хешкод класса Speaker ?
...
Рейтинг: 0 / 0
06.07.2006, 20:55
    #33836915
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
После "подчистки" кода по замечаниям ув. Jezic и изучения им указанного топика, обнаружил, что мои примеры заработали самостоятельно в консоли. Это безусловно радует, но с другой стороны несколько настораживает, что в debbuger Worker все же спотыкается (Я работаю с eclipse).
Огромное спасибо г-ну Jezic

С вашего позволения хотел бы спросить такого совета.
Весь этот пример был направлен на изучение взаимодействия объектов из разных потоков. Основная же задача заключается в следующем.
Мы разрабатываем большой проект, в котором будет много классов. Все эти классы естественно надо будет инициализировать.
Как правильно организовать этот процесс ?
Нужно ли инициализировать основные классы одним потоком, а потом обращаться к этим объектам как я это сделал на примере моего Worker.java – Speaker.java классов?
Или загрузить все основные объекты в хештаблицу и получать объекты оттуда по мере необходимости?

Как это делаете вы, коллеги ?

Буду искренне признателен за рекомендации.
С уважением
студент
...
Рейтинг: 0 / 0
07.07.2006, 12:26
    #33837979
Jozic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
kadetОгромное спасибо г-ну Jezicсливаешь сорцы, смотришь, правишь, а тебя в конце Jezic обзовут :) ну и на том спасибо :))
kadet
С вашего позволения хотел бы спросить такого совета.
Весь этот пример был направлен на изучение взаимодействия объектов из разных потоков. Основная же задача заключается в следующем.
Мы разрабатываем большой проект, в котором будет много классов. Все эти классы естественно надо будет инициализировать.
Как правильно организовать этот процесс ?
Нужно ли инициализировать основные классы одним потоком, а потом обращаться к этим объектам как я это сделал на примере моего Worker.java – Speaker.java классов?
Или загрузить все основные объекты в хештаблицу и получать объекты оттуда по мере необходимости?

Как это делаете вы, коллеги ?

Буду искренне признателен за рекомендации.
С уважением
студент не совсем понятно, что вам нужно. Обычно многопоточностю пользуюцца там где она нужна :). Не совсем понятно зачем она здесь?
kadetИли загрузить все основные объекты в хештаблицу и получать объекты оттуда по мере необходимости?
а это, если правильно понял ваше намерение, изобретение паттерна Registry http://www.martinfowler.com/eaaCatalog/registry.html
...
Рейтинг: 0 / 0
07.07.2006, 20:01
    #33839629
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
блин, я опять завис.
решил усложнить задачу. Я сделал так, чтоб Speaker знал о Wizard и показал его хешкод. Кроме этого инициализируется класс Wizard в Speaker не ссылкой, а так же вызовом метода getInstance(). Естественно все теперь засинхроизированно. Однако когда запускаеш сначало Wizard в одной консоли, а потом Worker в другой консоли, они вновь выдают разные значения.
я весь в смущении. мой "мир" рушится.

PS. блин какой то я вечнй студент.
Ради эксперемента я запустил Starter (который выполняет поседовательно Wizard, а потом Worker). Он отработал правильно.

научите плз.
...
Рейтинг: 0 / 0
10.07.2006, 13:00
    #33841985
vndovr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
Что значит "в одной консоли, ..., в другой консоли"? В разным java-машинах?
...
Рейтинг: 0 / 0
10.07.2006, 13:06
    #33842021
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
помогающийЧто значит "в одной консоли, ..., в другой консоли"? В разным java-машинах?

Присоединяюсь к вопросу. Если уважаемый автор запускает код в разных JVM - то ничего удивительного что коды не совпадают. Это то же самое, что запустить на разных компьютерах :-)

======================
- Я подхожу к клетке с медведем панда...
Видите, какие у него черные круги под глазами?!
Медведь панда как бы всем своим видом говорит нам: "Не бухайте!"
======================
...
Рейтинг: 0 / 0
11.07.2006, 08:42
    #33843898
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
спасибо что откликнулись.
В одной консоли и другой консоли означает, что class Wizard запускаются сначала в одной консоли (cmd.exe), а потом открывается еще одна консоль (cmd.exe)и в ней запускается класс Worker.
...
Рейтинг: 0 / 0
11.07.2006, 08:56
    #33843913
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
Кувалдин Роман помогающийЧто значит "в одной консоли, ..., в другой консоли"? В разным java-машинах?

Присоединяюсь к вопросу. Если уважаемый автор запускает код в разных JVM - то ничего удивительного что коды не совпадают. Это то же самое, что запустить на разных компьютерах :-)


Хм. мужики, я несколько озадачен. Честно говоря никогда об этом не задумывался, мне казалось, что установив SDK - имеем одну ява-машину, и все. Если же зауск в консоли
->java .....
приводит каждый раз к созданию новой яваМашины, то это меняет дело.Конечно глупо от нее требовать синхронности.
прошу поболее информации.
спасибо.

PS.пожалуйста не смейтесь над мной
кстати говоря должен заметить, что перед моим последним воплем о помощи
авторблин, я опять завис...
я запускал классы действительно в разных консолях, и последний раз они действительно работали синхронно. Было ли это совпадением ?
Предлогаю обсудить.
...
Рейтинг: 0 / 0
11.07.2006, 12:52
    #33844698
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
kadetХм. мужики, я несколько озадачен. Честно говоря никогда об этом не задумывался, мне казалось, что установив SDK - имеем одну ява-машину, и все. Если же зауск в консоли
->java .....
приводит каждый раз к созданию новой яваМашины, то это меняет дело.Конечно глупо от нее требовать синхронности.
прошу поболее информации.
спасибо.


интересен ваш ход мыслей, приведший к такому выводу. Если вы запустили два экземпляра, например, FAR - то они работают независимо друг от друга. Это же разные процессы.

kadet
PS.пожалуйста не смейтесь над мной
кстати говоря должен заметить, что перед моим последним воплем о помощи
авторблин, я опять завис...
я запускал классы действительно в разных консолях, и последний раз они действительно работали синхронно. Было ли это совпадением ?
Предлогаю обсудить.

Что значит "работали синхронно"?
...
Рейтинг: 0 / 0
11.07.2006, 13:00
    #33844733
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
Прочитал тут выше:
kadet...записал в нее моего Speaker и сериализовал хештаблицу в файл "myHashTable". Т.е вы обнаружите на "d:" новый файл "myHashTable" - результат работы класса Wizard. Если теперь из другой консоли запустить класс Worker, то он выдаст два значения: одно прочитает из файла "myHashTable", а другое получит от теперь уже синхронизированного блока метода getInstance(). И результат будет как говорится на "лицо" – два совершенно разных значения.
Где собака зарыта ?Зависит от того, чем сериализовал.
Может быть здесь зарыта ваша собака?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
 public   class  Hashtable {
            vvvvvvvvv
     private   transient  HashtableEntry table[]; // hash-table entries
            ^^^^^^^^^
     private   transient   int  count;              // number of entries
     private   int  threshold;                    // current size of hash-tabke
     private   float  loadFactor;                 // load factor
...
...
Рейтинг: 0 / 0
11.07.2006, 19:07
    #33846156
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
Кувалдин Роман kadetХм. мужики, я несколько озадачен. Честно говоря никогда об этом не задумывался, мне казалось, что установив SDK - имеем одну ява-машину, и все. Если же зауск в консоли
->java .....
приводит каждый раз к созданию новой яваМашины, то это меняет дело.Конечно глупо от нее требовать синхронности.
прошу поболее информации.
спасибо.


интересен ваш ход мыслей, приведший к такому выводу. Если вы запустили два экземпляра, например, FAR - то они работают независимо друг от друга. Это же разные процессы.

kadet
PS.пожалуйста не смейтесь над мной
кстати говоря должен заметить, что перед моим последним воплем о помощи
авторблин, я опять завис...
я запускал классы действительно в разных консолях, и последний раз они действительно работали синхронно. Было ли это совпадением ?
Предлогаю обсудить.

Что значит "работали синхронно"?
я имел ввиду, что хешКод объекта Speaker созданного экземпляром класса Wizard (запущенный из консоли 1), был абсолютно идентичен хешКоду который получил экземпляр класса Worker ( в свою очередь опросивший класс-сингелтон Speaker) из вновь запущенной консоли 2.
В этом и парадокс.
...
Рейтинг: 0 / 0
11.07.2006, 19:43
    #33846206
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
Я и не знал. Забавно получается :-)
Очевидно, java.exe пытается сначала зацепиться за уже загруженный jvm.dll, и только в случае неудачи загружает свой :-)

По крайней мере это единственное объяснение, в рамках которого можно объяснить результаты выполнениея команд:

Код: plaintext
1.
2.
3.
4.
5.
6.
C:\Development\Projects>java test.Wizard
Thread ID 1
I am a Speaker, my hashCode is 32942009

Try asks the Woker about a speaker !
Press [Enter] to stop

а затем:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
C:\Development\Projects>java -server test.Worker
Thread ID 9
I am a Speaker, my hashCode is 4565111

C:\Development\Projects>java -client test.Worker
Thread ID 7
I am a Speaker, my hashCode is 32942009


======================
- Я подхожу к клетке с медведем панда...
Видите, какие у него черные круги под глазами?!
Медведь панда как бы всем своим видом говорит нам: "Не бухайте!"
======================
...
Рейтинг: 0 / 0
11.07.2006, 19:50
    #33846220
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
Нет, все еще круче.
См. скриншот.

Я даже не знаю, что думать.


======================
- Я подхожу к клетке с медведем панда...
Видите, какие у него черные круги под глазами?!
Медведь панда как бы всем своим видом говорит нам: "Не бухайте!"
======================
...
Рейтинг: 0 / 0
11.07.2006, 20:03
    #33846234
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
В общем, похоже в клиентском режиме JVM начинает кучу с какого-то определенного адреса - см скриншот.

Я немного модифицировал твой код. Если бы там действительно был общий синглтон, то и при toString показывалось бы одно и то же время.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 package  test;

 public   class  Speaker {
...
     private  String checkField = "";
...
     protected  Speaker() {
        setCheck();
        myHashCode =  this .hashCode();
    }
...
     public  String toString() {
        System.out.println("CheckField: " + checkField);
         return  "I am a Speaker, my hashCode is " +  this .myHashCode;
    }

     private   void  setCheck() {
        checkField =  new  java.util.Date().toString();
    }
}
======================
- Я подхожу к клетке с медведем панда...
Видите, какие у него черные круги под глазами?!
Медведь панда как бы всем своим видом говорит нам: "Не бухайте!"
======================
...
Рейтинг: 0 / 0
12.07.2006, 12:01
    #33847418
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточное программирование: поделитесь опытом
большое спасибо всем кто откликнулся.
после продолжительного изучения ситуации я уяснил, что потоки и процессы есть совершенно разные вещи. Поэтому глупо требовать от яваМашины запущенной в одном процессе (одной консоле) знаний о существовании каких то объектов "живущих" в другом процессе (другой консоле). Я заметил, что когда создаешь различные объекты в рамках одного процесса (создавая при этом сколько угодно внутренних потоков) все работает корректно.
Если кому будет интересно, то сможет найти прикрепленные исходники к этому сообщению, с учетом изменений сделанными участниками этого топика.
В архиве находятся два пакета testOld и testNew. ТестНью содержит немного усложненный класс Speaker, который знает о существовании класса Wizard и инициализирует его не через ссылку, а по философии Singelton. Каждый пакет содержит класс StartFromOneThread, который запускает все классы последовательно в разных потоках.

PS.
А как же тогда оценить философию операционной среды, заключающуюся в том, что если в ос существуют различные объекты (типа демонов), то к ним можно обращаться из разных потоков ? Эта же кухня вся работает, а в рамках моего приложения - нет ?
спасибо за ответ.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / многопоточное программирование: поделитесь опытом / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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