Реклама

 
0 голосов
 
986 просмотров
22.07.2019 / 12:43  Death

Потоковая обработка

Есть задача обрабатывать в отдельном потоке от главного данные.

Часто делал так
Открыть спойлер

Но понял, что тут нагрузка есть на проверку условий 60 раз в секунду. А данные могут пачкой в 100 объектов придти, а может один раз в 5 минут. И вопрос: как сделать грамотно это место?

Мне нужно из главного потока отправить данные в отдельный поток для обработки. Не создавая поток только на один объект. Есть ли пулы потоков, в которые будут данные распределять? Чтобы во время простоя, потоки эти не нагружали процессор, а как только данные пришли, то потоки вызываю с объектом интерфейс, который я реализовал на обработку?
Ответы
 
1 голос
 
# 23.07.2019 / 10:58  Naik
Используй RxJava2, там 5 строчек кода выйдет, и не морочь голову
 
0 голосов
 
# 22.07.2019 / 15:52  Askalite
Используешь синхронищацию с использованием whait/notify:
уть его проста. Берется некий объект. Поток, который ждет выполнения каких-либо условий, вызывает у этого объекта метод wait, предварительно захватив его монитор. На этом его работа приостанавливается. Другой поток может вызвать на этом же самом объекте метод notify (опять же, предварительно захватив монитор объекта), в результате чего, ждущий на объекте поток "просыпается" и продолжает свое выполнение. Подчеркиваю, в обоих случаях монитор надо захватывать в явном виде, через synchronized-блок, ибо методы семейства wait/notify не синхронизированы!

  1. //Объект синхронизации:
  2. public static Object sync = new Object();
  3.  
  4. //
  5. public void run() {
  6.     System.out.println("own:: Thread started");
  7.     while(run){
  8.         synchronized(sync) {
  9.             //Если данных нет, то ждать.
  10.             if (data.value == false) {
  11.                 try {
  12.                     System.out.println("own:: Waiting");
  13.                     //ЖДЁМ МЕССЕДЖА ИЗ ГЛАВНОГО ПОТОКА
  14.                     sync.wait();
  15.                     System.out.println("own:: Running again");
  16.                 } catch (InterruptedException ex) {
  17.                     System.err.println("own:: Interrupted: "+ex.getMessage());
  18.                 }
  19.             }
  20.             data.обработать();
  21.             data.value=false;
  22.         }
  23.     }
  24. }

И в главном потоке если есть данные, то менять значение data.value на true и вызывать thread.notify();
  1. synchronized (sync){
  2.     data.value = true;
  3.     thread.notify();
  4. }

Распределение данных, всю эту фигню, писать ручками, синхронизировать ручками.

http://skipy.ru/technics/synchronization.html
 
0 голосов
 
# 22.07.2019 / 15:04  Death
Немного посидев в гугле, раз 10 заглянул на qaru и положив его(смотри скрин) я пошёл дальше поняв что гуглить точнее(задачи java) я наткнулся на урок по concurrency api java.

И есть идея создать класс реализующий Runnable принимающий в конструктор данные одного объекта и в методе run сделать обработку.
Так же создать singleton паттер для ExecutorService с 5 потоками
Потом создавая объект обработки, передавая в конструктор данные, отправлять его на executor.submit(process) я получу обработку в отдельном потоке, при том, что нагрузка будет распределяться на 5 потоков.

На сколько эта идея лучше, чем в вопросе с одним потоком и задержкой в 1000/60 миллисекунд?
Какие минусы и проблемы есть и будут?
Изм. Death от 22.07.2019 / 15:06

Screenshot_20190722-154346.jpg (176.16 кб.)
26.07.2019 / 07:55  pmtpmt
Ого, вы хакер
Всего: 3

Мы в соцсетях

vk tw tg yt

Пожертвования

Аноним2850 р.
Freddy1700 р.
riseremi1611 р.
NaruTrey800 р.
vlavolk637 р.