Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки, Многопоточное программирование 
:(
    Опции темы
GIK
Дата 18.1.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: нет
Всего: 14



Тфу блин, перепутал цифры.
Ну да такой, ну дак что как это объяснить?


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
LSD
Дата 18.1.2006, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Выполняется вызов метода run() из потока main, это порождает следующий вывод:
Код
Potok GoOOOOOOOOOO5
Potok GoOOOOOOOOOO4
Potok GoOOOOOOOOOO3
Potok GoOOOOOOOOOO2
Potok GoOOOOOOOOOO1

затем происходит запуск еще 2-х потоков, потоки начинаю работать почти одновременно и потому вывод из них идет по очереди, и соответсвенно получаем:
Код
Potok GoOOOOOOOOOO5
Potok GoOOOOOOOOOO5
Potok GoOOOOOOOOOO4
Potok GoOOOOOOOOOO4
Potok GoOOOOOOOOOO3
Potok GoOOOOOOOOOO3
Potok GoOOOOOOOOOO2
Potok GoOOOOOOOOOO2
Potok GoOOOOOOOOOO1
Potok GoOOOOOOOOOO1



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
GIK
Дата 18.1.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: нет
Всего: 14



Как объяснит тот факт, что после вызова run() напрямую, не через put(), другие потоки НЕ реализуются СРАЗУ (они ждут), через put() допустим, после вызова run() сразу происходит возврат к главному потоку, и они используют процессор как бы вместе. Но так не происходит если вызвать run() напрямую, т.е. не происходит возврата к другому(другим потокам), он использкет его один на все время затраченное на for цикле.

Или может, просто мне думать, что так оно есть и непарится, невникать в суть?
Хотя очень интересно.

Это сообщение отредактировал(а) GIK - 18.1.2006, 18:26


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
COVD
Дата 18.1.2006, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Как уже здесь писали, для запуска потока предназначен start(), который вызывает run(). Если программа вышла из run(), то поток умер и повторному использованию не подлежит. Метод run() напрямую не вызывают. И выяснение, что будет в случае прямого обращения к run(), имеет скорее академическую, но не практическую ценность. smile
PM MAIL   Вверх
LSD
Дата 18.1.2006, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



У тебя есть работающий поток. В рамках одного потока команды выполняются последовательно одна за одной, можно только изменить порядок их выполнения (это делают управляющие операторы if, for, break и т.д.). Поэтому когда ты пишешь такой код: run(); то ты просто передаешь управление в метод run, далее выполняются все команды из этого метода и ты продолжаешь с того места, где закончил. Именно этим и объясняется, поведение программы в первом случае.

Теперь рассмотрим, второй случай. Ты вызываешь метод put() (все это происходит в потоке main), создаешь в этом методе объект типа Thread (кстати ты даешь ему в качестве аргумента объект который реализует интерфейс Runnable, вот тебе хороший пример использования интерфейсов. Когда разрабатывался класс Thread, никто не знал о твоем классе, но им было достаточно знать, что он будет реализовывать Runnable, значит в нем будет метод run и его можно будет вызвать.) Создал объект, после чего вызываешь метод start(), который запускает новый поток, метод start() не ждет пока поток отработает, он просто дает сигнал на запуск и возвращается. Запущенный поток, иниализируется и выполняет метод run у объекта переданного в качестве аргумента. Там уже свой поток выполнения команд, независящий от потока который его запустил. Запустивший поток может закончить свое выполнение, но это никак не влияет на этот поток.

P.S. А вообще, тебе надо почитать какую нибудь книжку, на тему многопоточного программирования.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Galaran
  Дата 11.7.2009, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 25.5.2009

Репутация: 1
Всего: 2



Чтобы не плодить топики спрошу здесь:
Решил написать простой сервер чата и столкнулся с проблемой. Архитектура такова:
Есть один главный поток(принимает новые соединения), который создает объекты Connection(для каждого клиента - свой). При этом занося их в мэп вида (clientId : connection). В класс Connection инкапсулирован поток прослушивания пакетов от клиента. Если поступает пакет с сообщением, этот поток обращается к синглтону EventHandler(защищен - к нему может одновременно обращаться с запросом обработать событие только один коннект), он обращается в мэпу и рассылает сообщения клиентам. 

При таком подходе сразу возникла проблема:
Клиент может разорвать коннект или же коннект может разорваться в случае ошибки. При этом надо как-то удалить из хеш-массива запись этого коннекшена и остановить соответствующий поток. Из этого потока, в котором возникла ошибка это сделать не выйдет(или выйдет ? он же удалит сам себя из хэшмэп, но при этом будет ещё выполняться и удачно завершится. Не опасно ли это?)

Т.е, как я понимаю, надо создать поток-демон для отслеживания таких вот отвалившихся клиентов и посылать ему сообщение(как ?), если клиент отвалился. При этом поток коннекшена завершится, а демон удалит из хеш-массива этот коннекшн.

Подскажите как лучше в данном случае построить архитектуру, и где об этом можно почитать
PM MAIL   Вверх
Galaran
Дата 12.7.2009, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 25.5.2009

Репутация: 1
Всего: 2



Вопрос снят, нашёл здесь: http://www.javatalks.ru/sutra39952.php
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0950 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.