Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / многопоточность...как лучше организовать? / 25 сообщений из 160, страница 1 из 7
10.12.2020, 18:47
    #40026517
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
есть сервлет
в нем вызывается метод A из из класса AA
в методе А есть такое
вывод сообщения
вызов метода В из класса ВВ
вывод сообщения

метод В synchronized
в методе В идёт работа с железом , работать может только один "метод", работа идёт 20сек

если одновременно к сервлету обращаются 2 клиента то происходит следующее
первому клиенту оправляется сообщение, вызывается метод В, отрабатывает, отправляется второе сообщение
и только потом второму клиенту отправляется первое сообщение, ну и далее...
всё отрабатывает правильно - с железом работают по очереди не конфликтуя.

проблема в том , что пока не отрабоает первые клиент - второй не получает сообщение эти 20 сек, и он начинает сомневаться в работе системы
как сделать так чтоб первое сообщение (с текстом "ждите") появилось сразу у всех клиентов, ну а обработка в методе В шла по очереди?
...
Рейтинг: 0 / 0
10.12.2020, 18:51
    #40026518
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
Это называется "критическая секция".

Варианты - разные.

Код: java
1.
2.
3.
syncronized(object) {
   ....
}



Или Reentrant lock. Как в документации https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantLock.html

Или есть еще вариант семафор. Для более сложной логики.
...
Рейтинг: 0 / 0
10.12.2020, 18:56
    #40026525
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
mayton,

меня смущает то, что метод А получается заблокирован.
может метод В вызывать отдельном потоке?

но как синхронизировать методы В?
...
Рейтинг: 0 / 0
10.12.2020, 19:15
    #40026534
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
Попробуй нарисовать свой алгоритм в виде такой картики (по образу и подобию).
Здесь например точки - это потоки. Кружочки - состояния. А прямоугольники - это барьеры (Locks, CriticalSections) которые либо
делают форк новых потоков либо join с условием.

...
Рейтинг: 0 / 0
10.12.2020, 19:18
    #40026535
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
вадя
методе В идёт работа с железом ,
что именно ломается если одновременно?
...
Рейтинг: 0 / 0
10.12.2020, 19:21
    #40026537
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
вадя
как сделать так чтоб первое сообщение (с текстом "ждите") появилось сразу у всех клиентов, ну а обработка в методе В шла по очереди?
в js таймер на 2 сек. Если не пришло то мессагу
...
Рейтинг: 0 / 0
10.12.2020, 19:24
    #40026538
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
вадя
mayton,

меня смущает то, что метод А получается заблокирован.
может метод В вызывать отдельном потоке?

но как синхронизировать методы В?
еще раз вопрос.
Если убрать synchronized то что ломается?
...
Рейтинг: 0 / 0
10.12.2020, 19:27
    #40026540
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
вадя
есть сервлет ...
Код: java
1.
2.
3.
4.
вывод сообщения
flush();
вызов метода В из класса ВВ
вывод сообщения

?
...
Рейтинг: 0 / 0
10.12.2020, 19:28
    #40026542
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
вадя
чтоб первое сообщение (с текстом "ждите") появилось сразу у всех клиентов,
странная у тебя логика
Часики или прогрессбар или Ждите.... делают клиенты у себя.
Сервер причем?)
...
Рейтинг: 0 / 0
10.12.2020, 19:32
    #40026544
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
mayton,

начал и возник вопрос - клиенты обращаются к сервлету - для каждого клиента сервлет работает в отдельном потоке? сервлет вызывает метод А , этот метод доступен этому же сервлету другого клиента?
чисто из логики метод А может запускаться параллельно - все данные только входные + обращение к базе.
...
Рейтинг: 0 / 0
10.12.2020, 19:34
    #40026545
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
PetroNotC Sharp
что именно ломается если одновременно?
железо пишет что занято и не допускает изменения внутри себя
...
Рейтинг: 0 / 0
10.12.2020, 19:34
    #40026546
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
вадя
PetroNotC Sharp
что именно ломается если одновременно?
железо пишет что занято и не допускает изменения внутри себя
блин, ну подробнее напиши...
...
Рейтинг: 0 / 0
10.12.2020, 19:36
    #40026548
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
вадя
клиента сервлет работает в отдельном потоке?
есле не тормозить синхронизацией. Очевидно же
...
Рейтинг: 0 / 0
10.12.2020, 19:37
    #40026549
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
вадя
этот метод доступен этому же сервлету другого клиента?
да. Но отправка КЛИЕНТУ только в конце GET
...
Рейтинг: 0 / 0
10.12.2020, 19:37
    #40026551
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
вадя
если одновременно к сервлету обращаются 2 клиента то происходит следующее
первому клиенту оправляется сообщение, вызывается метод В, отрабатывает, отправляется второе сообщение
и только потом второму клиенту отправляется первое сообщение

мне одному не очевидно, почему так? У тебя метод А тоже синхронизирован? Или метод сервлета? Если нет, то метод сервлета и первое сообщение (я ж надеюсь оно асинхронное?) из А должно вызываться столько раз одновременно, сколько одновременных обращений, просто все кроме одного застрянут на вызове метода B и будут ждать входа. И причем тут критические секции я тоже не понял. По-моему тут речь об организации асинхронного обмена сообщениями с клиентами при наличии блокирующей очереди. Как раз таки задачка для твоих любимых вебсокетов (как пример, другое ж все равно не возмьешь) - передал уникальный id, поставил задачу в очередь - получил результат и отправил заказчику.
...
Рейтинг: 0 / 0
10.12.2020, 19:37
    #40026552
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
PetroNotC Sharp
в js таймер на 2 сек. Если не пришло то мессагу
это на js, это работа идёт через телеграм....

хотя в твоём упоминание js есть очень привлекательная мысль. но не решающая данную проблему....очень даже хорошая мысль....
...
Рейтинг: 0 / 0
10.12.2020, 19:39
    #40026553
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
Ну или ранше времени выше flush написали. Или асинхронный сервлет или....
...
Рейтинг: 0 / 0
10.12.2020, 19:39
    #40026554
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
вадя
mayton,

начал и возник вопрос - клиенты обращаются к сервлету - для каждого клиента сервлет работает в отдельном потоке? сервлет вызывает метод А , этот метод доступен этому же сервлету другого клиента?
чисто из логики метод А может запускаться параллельно - все данные только входные + обращение к базе.

Надо почитать спеку. По моему сервлет обладает из коробки идеальным параллелизмом.
А ограничения уже ставят в него Tomcat/ и сами разрабы когда привязываеют его в БД коннекшенам пулам и прочее.
...
Рейтинг: 0 / 0
10.12.2020, 19:43
    #40026558
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
mayton,
Пока он пример в коде не даст, будем гадать...
...
Рейтинг: 0 / 0
10.12.2020, 19:46
    #40026559
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
сервлет работает с telegram, сообщения приходят из telegram, и туда же отправляются
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("POST");
            con.setRequestProperty("Content-Type", "application/json; utf-8");
            con.setRequestProperty("Accept", "application/json");
            con.setRequestProperty("Accept-Charset", "UTF-8");
            con.setDoOutput(true);
            OutputStream os = con.getOutputStream();
            byte[] input = message.getBytes("utf-8");
            os.write(input, 0, input.length);
            os.flush();


chpasha
У тебя метод А тоже синхронизирован?
нет, не сихронизирован
chpasha
Или метод сервлета?
нет, метод не сервлета
chpasha
из А должно вызываться столько раз одновременно, сколько одновременных обращений, просто все кроме одного застрянут на вызове метода B и будут ждать входа. И причем тут критические секции я тоже не понял.
вот тут запутался.
если б ws - было б по другому - проще или сложнее трудно сказать.
...
Рейтинг: 0 / 0
10.12.2020, 19:49
    #40026562
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
грубо говоря - ответы идут не коннкшеном сервлета , а каждый раз новым, плохо это или хорошо - вопрос открытый, на данном этапе нужно просто заставить все работать.
...
Рейтинг: 0 / 0
10.12.2020, 19:53
    #40026564
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
вадя
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("POST");
            con.setRequestProperty("Content-Type", "application/json; utf-8");
            con.setRequestProperty("Accept", "application/json");
            con.setRequestProperty("Accept-Charset", "UTF-8");
            con.setDoOutput(true);
            OutputStream os = con.getOutputStream();
            byte[] input = message.getBytes("utf-8");
            os.write(input, 0, input.length);
            os.flush();

убери все в методы А и Б!
И код сюда.
Нафиг нам требуху твою смотреть.
...
Рейтинг: 0 / 0
10.12.2020, 19:56
    #40026566
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
вадя,
Это метод setPostTelega()?
...
Рейтинг: 0 / 0
10.12.2020, 20:01
    #40026571
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
PetroNotC Sharp
Пока он пример в коде не даст, будем гадать...
всё под кошкой
стоит фильтр - рулится с подключениями - код "стандартный"
дальше - сервлет doPost, получает данные от telegram в виде json - обработка, выделение нужного
всё "стандартно" , по итогу вызов метода из класса А , в классе А методов несколько , вызываются в зависимости от обработки сообщения telegram.

в методе А обрабатываются данные и по результатам обработки вызывается метод И из класса ВВ
всё стандартно, если б не 20секунд...
...
Рейтинг: 0 / 0
10.12.2020, 20:01
    #40026572
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопоточность...как лучше организовать?
А сколько милисекунд это занимает?

Код: java
1.
2.
 os.write(input, 0, input.length);
 os.flush();
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / многопоточность...как лучше организовать? / 25 сообщений из 160, страница 1 из 7
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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