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

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

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

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

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

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

Ну в общем, архитектура кривая и непродуманная - отсюда и сложности с реализацией...
...
Рейтинг: 0 / 0
14.01.2014, 11:03
    #38525303
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача с потоками
GorloPavel,авторЭто поток(Thread) сокета. В нем обрабатываются данные от клиента и к примеру при авторизации эта сессия добавляется в HashMap. При потере соединения сессия должна удалить себя из HashMap и БД.
у нас нет никакой библиотеки выше уровня для создания списка юзер-сессий?
Если её нет, то зачем вам постоянно актуальный список на 1000 пользователей?
...
Рейтинг: 0 / 0
14.01.2014, 14:32
    #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
14.01.2014, 14:57
    #38525697
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача с потоками
GorloPavel ,
А вопрос в чем?
...
Рейтинг: 0 / 0
14.01.2014, 15:00
    #38525700
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача с потоками
GorloPavel,
раз у тебя всё Асинхронно и Потоково, то использовать твой счётчик не представляется возможным. Разве не так?
Опять идём к постановке задачи и велосипедам.
...
Рейтинг: 0 / 0
14.01.2014, 15:01
    #38525701
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача с потоками
cdtyjv GorloPavel ,
А вопрос в чем?
В том как изменять это число правильно. Ведь из разных потоков как выясняется нельзя. Обернуть в synhronized?
...
Рейтинг: 0 / 0
14.01.2014, 15:01
    #38525703
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача с потоками
...
Рейтинг: 0 / 0
14.01.2014, 15:20
    #38525746
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача с потоками
Petro123GorloPavel,

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


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