|
|
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
Всем привет. Коллеги, поделитесь плз опытом. Как можно решить такую задачу? Допустим имеем три класса: 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. Код: plaintext 1. 2. я прицепил исходники к сообщению ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 14:41 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
getInstance нужно сделать synchronized либо синхронизировать по объекту класса Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 15:17 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
да, забыл Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 15:18 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
неясно че надо, скорее всего требуется ThreadLocal. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 15:27 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
Shkel EugenegetInstance нужно сделать synchronized либо синхронизировать по объекту класса Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 15:30 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
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). ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 15:45 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
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). ... я это знаю :) не въехал че надо от этих классов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 16:06 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
Shkel Eugeneда, забыл Код: plaintext 1. спасибо всем кто откликнулся. К сожалению исправления не помогли. Я прицепил новый вариант к сообщению вместе с jar архивом. Мне кажется я не совсем ясно изложил мысль. Мне надо создав объект в одном потоке, дотянутся до этого объекта из другого потока. Я дополнил метод getInstance() класса Speaker синхронизованным блоком synchronized(Speaker.class){...} В новую версию я так же воткнул хештаблицу, записал в нее моего Speaker и сериализовал хештаблицу в файл "myHashTable". Т.е вы обнаружите на "d:" новый файл "myHashTable" - результат работы класса Wizard. Если теперь из другой консоли запустить класс Worker, то он выдаст два значения: одно прочитает из файла "myHashTable", а другое получит от теперь уже синхронизированного блока метода getInstance(). И результат будет как говорится на "лицо" – два совершенно разных значения. Где собака зарыта ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 17:47 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
kadet у вас Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 18:15 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
kadetЯ дополнил метод getInstance() класса Speaker синхронизованным блоком synchronized(Speaker.class){...} Этого не хватит, смотрите ссылку, которую я давал выше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 18:23 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
Jozic а должно быть Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. огромное спасибо за замечание. я действительно это проглядел по запарке. Я непременно сейчас же буду изучать Вашу ссылку. Сейчас же хочу заметить следующее: после исправления я создал класс и в его методе main запустил последовательно оба класса: Wizard и Worker. Оба отработали правильно и дали один и тот же хеш код для Speaker. Однако почему то когда я запустил по отдельности сначало класс Wizard а потом в ДЕББУГЕ прошел класс Worker, то Worker дал другой хешкод класса Speaker ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 19:11 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
После "подчистки" кода по замечаниям ув. Jezic и изучения им указанного топика, обнаружил, что мои примеры заработали самостоятельно в консоли. Это безусловно радует, но с другой стороны несколько настораживает, что в debbuger Worker все же спотыкается (Я работаю с eclipse). Огромное спасибо г-ну Jezic С вашего позволения хотел бы спросить такого совета. Весь этот пример был направлен на изучение взаимодействия объектов из разных потоков. Основная же задача заключается в следующем. Мы разрабатываем большой проект, в котором будет много классов. Все эти классы естественно надо будет инициализировать. Как правильно организовать этот процесс ? Нужно ли инициализировать основные классы одним потоком, а потом обращаться к этим объектам как я это сделал на примере моего Worker.java – Speaker.java классов? Или загрузить все основные объекты в хештаблицу и получать объекты оттуда по мере необходимости? Как это делаете вы, коллеги ? Буду искренне признателен за рекомендации. С уважением студент ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 20:55 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
kadetОгромное спасибо г-ну Jezicсливаешь сорцы, смотришь, правишь, а тебя в конце Jezic обзовут :) ну и на том спасибо :)) kadet С вашего позволения хотел бы спросить такого совета. Весь этот пример был направлен на изучение взаимодействия объектов из разных потоков. Основная же задача заключается в следующем. Мы разрабатываем большой проект, в котором будет много классов. Все эти классы естественно надо будет инициализировать. Как правильно организовать этот процесс ? Нужно ли инициализировать основные классы одним потоком, а потом обращаться к этим объектам как я это сделал на примере моего Worker.java – Speaker.java классов? Или загрузить все основные объекты в хештаблицу и получать объекты оттуда по мере необходимости? Как это делаете вы, коллеги ? Буду искренне признателен за рекомендации. С уважением студент не совсем понятно, что вам нужно. Обычно многопоточностю пользуюцца там где она нужна :). Не совсем понятно зачем она здесь? kadetИли загрузить все основные объекты в хештаблицу и получать объекты оттуда по мере необходимости? а это, если правильно понял ваше намерение, изобретение паттерна Registry http://www.martinfowler.com/eaaCatalog/registry.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2006, 12:26 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
блин, я опять завис. решил усложнить задачу. Я сделал так, чтоб Speaker знал о Wizard и показал его хешкод. Кроме этого инициализируется класс Wizard в Speaker не ссылкой, а так же вызовом метода getInstance(). Естественно все теперь засинхроизированно. Однако когда запускаеш сначало Wizard в одной консоли, а потом Worker в другой консоли, они вновь выдают разные значения. я весь в смущении. мой "мир" рушится. PS. блин какой то я вечнй студент. Ради эксперемента я запустил Starter (который выполняет поседовательно Wizard, а потом Worker). Он отработал правильно. научите плз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2006, 20:01 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
Что значит "в одной консоли, ..., в другой консоли"? В разным java-машинах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2006, 13:00 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
помогающийЧто значит "в одной консоли, ..., в другой консоли"? В разным java-машинах? Присоединяюсь к вопросу. Если уважаемый автор запускает код в разных JVM - то ничего удивительного что коды не совпадают. Это то же самое, что запустить на разных компьютерах :-) ====================== - Я подхожу к клетке с медведем панда... Видите, какие у него черные круги под глазами?! Медведь панда как бы всем своим видом говорит нам: "Не бухайте!" ====================== ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2006, 13:06 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
спасибо что откликнулись. В одной консоли и другой консоли означает, что class Wizard запускаются сначала в одной консоли (cmd.exe), а потом открывается еще одна консоль (cmd.exe)и в ней запускается класс Worker. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2006, 08:42 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
Кувалдин Роман помогающийЧто значит "в одной консоли, ..., в другой консоли"? В разным java-машинах? Присоединяюсь к вопросу. Если уважаемый автор запускает код в разных JVM - то ничего удивительного что коды не совпадают. Это то же самое, что запустить на разных компьютерах :-) Хм. мужики, я несколько озадачен. Честно говоря никогда об этом не задумывался, мне казалось, что установив SDK - имеем одну ява-машину, и все. Если же зауск в консоли ->java ..... приводит каждый раз к созданию новой яваМашины, то это меняет дело.Конечно глупо от нее требовать синхронности. прошу поболее информации. спасибо. PS.пожалуйста не смейтесь над мной кстати говоря должен заметить, что перед моим последним воплем о помощи авторблин, я опять завис... я запускал классы действительно в разных консолях, и последний раз они действительно работали синхронно. Было ли это совпадением ? Предлогаю обсудить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2006, 08:56 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
kadetХм. мужики, я несколько озадачен. Честно говоря никогда об этом не задумывался, мне казалось, что установив SDK - имеем одну ява-машину, и все. Если же зауск в консоли ->java ..... приводит каждый раз к созданию новой яваМашины, то это меняет дело.Конечно глупо от нее требовать синхронности. прошу поболее информации. спасибо. интересен ваш ход мыслей, приведший к такому выводу. Если вы запустили два экземпляра, например, FAR - то они работают независимо друг от друга. Это же разные процессы. kadet PS.пожалуйста не смейтесь над мной кстати говоря должен заметить, что перед моим последним воплем о помощи авторблин, я опять завис... я запускал классы действительно в разных консолях, и последний раз они действительно работали синхронно. Было ли это совпадением ? Предлогаю обсудить. Что значит "работали синхронно"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2006, 12:52 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
Прочитал тут выше: kadet...записал в нее моего Speaker и сериализовал хештаблицу в файл "myHashTable". Т.е вы обнаружите на "d:" новый файл "myHashTable" - результат работы класса Wizard. Если теперь из другой консоли запустить класс Worker, то он выдаст два значения: одно прочитает из файла "myHashTable", а другое получит от теперь уже синхронизированного блока метода getInstance(). И результат будет как говорится на "лицо" – два совершенно разных значения. Где собака зарыта ?Зависит от того, чем сериализовал. Может быть здесь зарыта ваша собака? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2006, 13:00 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
Кувалдин Роман kadetХм. мужики, я несколько озадачен. Честно говоря никогда об этом не задумывался, мне казалось, что установив SDK - имеем одну ява-машину, и все. Если же зауск в консоли ->java ..... приводит каждый раз к созданию новой яваМашины, то это меняет дело.Конечно глупо от нее требовать синхронности. прошу поболее информации. спасибо. интересен ваш ход мыслей, приведший к такому выводу. Если вы запустили два экземпляра, например, FAR - то они работают независимо друг от друга. Это же разные процессы. kadet PS.пожалуйста не смейтесь над мной кстати говоря должен заметить, что перед моим последним воплем о помощи авторблин, я опять завис... я запускал классы действительно в разных консолях, и последний раз они действительно работали синхронно. Было ли это совпадением ? Предлогаю обсудить. Что значит "работали синхронно"? я имел ввиду, что хешКод объекта Speaker созданного экземпляром класса Wizard (запущенный из консоли 1), был абсолютно идентичен хешКоду который получил экземпляр класса Worker ( в свою очередь опросивший класс-сингелтон Speaker) из вновь запущенной консоли 2. В этом и парадокс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2006, 19:07 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
Я и не знал. Забавно получается :-) Очевидно, java.exe пытается сначала зацепиться за уже загруженный jvm.dll, и только в случае неудачи загружает свой :-) По крайней мере это единственное объяснение, в рамках которого можно объяснить результаты выполнениея команд: Код: plaintext 1. 2. 3. 4. 5. 6. а затем: Код: plaintext 1. 2. 3. 4. 5. 6. 7. ====================== - Я подхожу к клетке с медведем панда... Видите, какие у него черные круги под глазами?! Медведь панда как бы всем своим видом говорит нам: "Не бухайте!" ====================== ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2006, 19:43 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
Нет, все еще круче. См. скриншот. Я даже не знаю, что думать. ====================== - Я подхожу к клетке с медведем панда... Видите, какие у него черные круги под глазами?! Медведь панда как бы всем своим видом говорит нам: "Не бухайте!" ====================== ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2006, 19:50 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
В общем, похоже в клиентском режиме JVM начинает кучу с какого-то определенного адреса - см скриншот. Я немного модифицировал твой код. Если бы там действительно был общий синглтон, то и при toString показывалось бы одно и то же время. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. - Я подхожу к клетке с медведем панда... Видите, какие у него черные круги под глазами?! Медведь панда как бы всем своим видом говорит нам: "Не бухайте!" ====================== ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2006, 20:03 |
|
||
|
многопоточное программирование: поделитесь опытом
|
|||
|---|---|---|---|
|
#18+
большое спасибо всем кто откликнулся. после продолжительного изучения ситуации я уяснил, что потоки и процессы есть совершенно разные вещи. Поэтому глупо требовать от яваМашины запущенной в одном процессе (одной консоле) знаний о существовании каких то объектов "живущих" в другом процессе (другой консоле). Я заметил, что когда создаешь различные объекты в рамках одного процесса (создавая при этом сколько угодно внутренних потоков) все работает корректно. Если кому будет интересно, то сможет найти прикрепленные исходники к этому сообщению, с учетом изменений сделанными участниками этого топика. В архиве находятся два пакета testOld и testNew. ТестНью содержит немного усложненный класс Speaker, который знает о существовании класса Wizard и инициализирует его не через ссылку, а по философии Singelton. Каждый пакет содержит класс StartFromOneThread, который запускает все классы последовательно в разных потоках. PS. А как же тогда оценить философию операционной среды, заключающуюся в том, что если в ос существуют различные объекты (типа демонов), то к ним можно обращаться из разных потоков ? Эта же кухня вся работает, а в рамках моего приложения - нет ? спасибо за ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 12:01 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=33841985&tid=2148703]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
159ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 240ms |
| total: | 497ms |

| 0 / 0 |
