powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Задача с потоками
17 сообщений из 17, страница 1 из 1
Задача с потоками
    #38520121
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Допустим есть некий главный Thread и еще какая-то группа Thread-ов. Можно ли сделать так, что бы при возникновении какого-то события в одном из тредов, этот самый тред вызывал метод главного треда и этот метод выполнялся в контексте главного треда? Т.е по простому... один из потоков дает команду главному потоку что-то сделать и это самое "что-то сделать" выполняет главный поток.
...
Рейтинг: 0 / 0
Задача с потоками
    #38520122
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мыслите не потоками а событиями. Ваша задача легко решается очередью, произошло событие, положили его в очередь, главный поток постоянно висит на очереди и обрабатывает события
...
Рейтинг: 0 / 0
Задача с потоками
    #38520175
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavel,

а в каком смысле контекст потока?
...
Рейтинг: 0 / 0
Задача с потоками
    #38520243
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelЗдравствуйте. Допустим есть некий главный Thread и еще какая-то группа Thread-ов. Можно ли сделать так, что бы при возникновении какого-то события в одном из тредов, этот самый тред вызывал метод главного треда и этот метод выполнялся в контексте главного треда? Т.е по простому... один из потоков дает команду главному потоку что-то сделать и это самое "что-то сделать" выполняет главный поток.
В такой постановке задачи точно нельзя. Подобные механизмы реализуются через очередь событий, но сказать подходит ли это для решения вашей проблемы сложно. Поэтому обрисуйте лучше свою проблему, а не решение, которое вам видится.
...
Рейтинг: 0 / 0
Задача с потоками
    #38520693
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Вот эта проблема. Хотел сделать очередь добавления и удаления сессий. Чтобы бы один поток писал и удалял элементы их мапы.
...
Рейтинг: 0 / 0
Задача с потоками
    #38520706
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelВот эта проблема. Хотел сделать очередь добавления и удаления сессий. Чтобы бы один поток писал и удалял элементы их мапы.
Проще простого. Заводишь один единственный ThreadPoolExecutor размером в один поток. И из других потоков просто сабмитишь в него задачи.
А этот executor выполняет какую-то одну задачу синхронно в своём единственном потоке. Соответственно это код не нужно дополнитльно защищать от конкурентного доступа.
...
Рейтинг: 0 / 0
Задача с потоками
    #38523356
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczGorloPavelВот эта проблема. Хотел сделать очередь добавления и удаления сессий. Чтобы бы один поток писал и удалял элементы их мапы.
Проще простого. Заводишь один единственный ThreadPoolExecutor размером в один поток. И из других потоков просто сабмитишь в него задачи.
А этот executor выполняет какую-то одну задачу синхронно в своём единственном потоке. Соответственно это код не нужно дополнитльно защищать от конкурентного доступа.

Как я понимаю мне поможет ExecutorService на один поток и реализация интерфейса Callable для моего класса? Если не трудно, то покажите пример. Спасибо!
...
Рейтинг: 0 / 0
Задача с потоками
    #38523407
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelКак я понимаю мне поможет ExecutorService на один поток и реализация интерфейса Callable для моего класса? Если не трудно, то покажите пример. Спасибо!Пример как создать ExecutorService и вызвать на нем Runnable/Callable? Ну это можно и самому нагуглить, или в JavaDoc посмотреть. Не ленитесь, это элементарнейшая вещь. Если вы и дальше будете так на каждый элементарный шаг просить помощи, то перспективы вашего профессионального развития будут очень туманными.

Что касается однопоточного экзекьютора, учтите, что в вашей задаче много долгих операций, а так же блокирующих операций. В одном потоке это (обслуживание многих клиентов), как минимум, работать очень медленное, а как максимум - вообще не будет работать.
Поэтому я бы вам рекомендовал не в одном потоке все делать, а написать нормальную синхронизацию. Если все же хотите один поток, то тогда вам скорее всего надо переходить с IO на NIO.
...
Рейтинг: 0 / 0
Задача с потоками
    #38523414
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavel ,
Вообще, что бы избежать очередного многостраничного топика, где никто ничего не понимает, лучше дайте полное описание задачи. Упрощенное, без лишних деталей, но чтобы было понятно, чего вы хотите добиться. Я более, чем уверен, что там достаточно незамысловатая задача, которую спокойно можно решить в многопоточном режиме.
...
Рейтинг: 0 / 0
Задача с потоками
    #38524999
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv,

Конечно задача там не сложная, вот только непонятно, зачем вместо очевидных вещей (GUID например), которые могут быть использованы на среднем (апп сервер) уровне изобретать костыль в виде получения уникального идентификатора сессии из таблицы БД?

Ну в общем, архитектура кривая и непродуманная - отсюда и сложности с реализацией...
...
Рейтинг: 0 / 0
Задача с потоками
    #38525303
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavel,авторЭто поток(Thread) сокета. В нем обрабатываются данные от клиента и к примеру при авторизации эта сессия добавляется в HashMap. При потере соединения сессия должна удалить себя из HashMap и БД.
у нас нет никакой библиотеки выше уровня для создания списка юзер-сессий?
Если её нет, то зачем вам постоянно актуальный список на 1000 пользователей?
...
Рейтинг: 0 / 0
Задача с потоками
    #38525655
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем суть вот в чем. Есть поток коорый принимает подключения
Код: java
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.
private class ListenConnections implements Runnable
	{
		public void run() {
			try {
				
				Socket acceptClient = null;
				
				while(true){
					
					acceptClient=mSocketListener.accept();
					
					if(SESSONS_COUNT<SETTINGS.HUB_MAX_CONNECTIONS){
						acceptClient.setSoTimeout(SETTINGS.HUB_TIME_OUT);
						new Thread(new Session(acceptClient,Hub.this)).start();
						SESSONS_COUNT++;
					}else{
						sendData(acceptClient, new Packets.Error(ErrorCodes.SERVER_OVERLOADED));
						acceptClient.close();
					}
					
				}
			}catch(Exception ex){
				ex.printStackTrace();
				if(!mStopServer){
					LogHelper.logError(ex, "ListenConnections");
				}				
			}
		}
	}


При каждом подключении SESSONS_COUNT++. Так я могу знать сколько подключений активно. Сам клиент при отключении как-то должен уменьшать это число. Но ведь событие отключения тоже происходит в другом потоке.

Код: java
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.
public void run() {
		try {
			int receivedBytes=0;
			byte[] dataBuffer = new byte[Hub.SESSION_BUFFER_SIZE];
			InputStream stream=mClientSocket.getInputStream();
			
			//Пока данные есть...
			while ((receivedBytes = stream.read(dataBuffer, 0, dataBuffer.length)) != -1) {
				if(!isPeerToPeer()){
					mPacketSplitter.splitData(dataBuffer, receivedBytes);
				}
				else{
					getPartner().sendRawData(dataBuffer, receivedBytes);
				}
			}

			Hub.SESSONS_COUNT--;
		}catch (Exception e) {
			Hub.SESSONS_COUNT--;
		}
		finally{
			try {
				mClientSocket.close();
			} catch (IOException e) {
				System.out.println(String.format("ERROR CLOSE! ID =%s",getHostId()));
				e.printStackTrace();
			}
		}
	}
...
Рейтинг: 0 / 0
Задача с потоками
    #38525697
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavel ,
А вопрос в чем?
...
Рейтинг: 0 / 0
Задача с потоками
    #38525700
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavel,
раз у тебя всё Асинхронно и Потоково, то использовать твой счётчик не представляется возможным. Разве не так?
Опять идём к постановке задачи и велосипедам.
...
Рейтинг: 0 / 0
Задача с потоками
    #38525701
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv GorloPavel ,
А вопрос в чем?
В том как изменять это число правильно. Ведь из разных потоков как выясняется нельзя. Обернуть в synhronized?
...
Рейтинг: 0 / 0
Задача с потоками
    #38525703
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Задача с потоками
    #38525746
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123GorloPavel,

http://www.ibm.com/developerworks/ru/library/j-jtp11234/
Огромное спасибо!
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Задача с потоками
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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