@jvmchat

Страница 2735 из 2890
Dim
16.08.2018
07:52:47
ну вдруг там все накрылось медным тазом...

Alexander
16.08.2018
07:52:57
кто тут кроме вас лучше поймет. я и так и так делаю по случаю

Павел
16.08.2018
07:53:41
если нужны фишки от гуавы - берите ее. если нет, юзайте хэшмап с шедулером
Ну вопрос в том что есть еще? Я выбираю среди двух вариантов и решил спросить у народа может есть еше вариант

Google
Artjom
16.08.2018
08:16:20
Я про кэш спрашиваю
Caffeine весьма хорош для кэширования

Grushin
16.08.2018
08:16:54
Долбаный гугл. Пытаюсь google-java-format завести на андроиде. А там блин java 8. Долбаный гугл

Timur
16.08.2018
08:17:40
А в андроиде какая версия? 7 до сих пор?

Akim
16.08.2018
08:20:26
В Андроиде есть поддержка восьмой, но не все методы доступны на низких версиях апи

Timur
16.08.2018
08:21:24
ого. Тяжко вам.

Akim
16.08.2018
08:22:18
Dmitriy
16.08.2018
08:23:21
24+
не совсем верно. некоторые фичи восьмой (те же лямбды) и на 15 можно использовать

Grushin
16.08.2018
08:24:02
Я пишу IDEA под андроид..) Приложение использует встроенный линукс, подключается с помощью proot. Уже поставил и jdk8 для arm hf.. Я юзаю google-java-format через этот же jdk но просто каряво это очень.

@android_ru
Да да просто бомбит

Akim
16.08.2018
08:25:39
Да да просто бомбит
Бомбит когда нужно пересобирать либу под новые версии, а она использует деприкейтед апи тех либ и вместо работы над проектом, приходится ковырять либы

Google
Grushin
16.08.2018
08:26:33
В апи яндекса (авторизация через яндекс) помню чет не работало как нам надо было

Его тоже пришлось вскрыть

Vitaly
16.08.2018
09:01:54
У меня есть Executor внутри которого я запускаю Callable, мне нужно заблокировать методом wait конкретный Callable, а точнее его поток, но блокиреутся вся группа потоков почему-то, в таком случае я решил сделать Thread.currentThread().wait(), что меня удовлетворяло, но теперь нельзя оживить поток при необходимости методом notifyAll() Как это исправить?

Vitaly
16.08.2018
09:10:52
просто notifyAll()

Vladimir
16.08.2018
09:11:24
не как, а кем, то есть из какого потока/источника

Vitaly
16.08.2018
09:12:35
Из другого потока в том же Executor

Vladimir
16.08.2018
09:13:43
то есть ссылки на эти callable где-то хранятся/передаются между callable?

Vladimir
16.08.2018
09:15:08
Нет
так как тогда один callable уведомит другой, не имея на него ссылки?

Vitaly
16.08.2018
09:15:25
Сейчас попробую передавать и вызывать notify конкретного callable

Vladimir
16.08.2018
09:17:52
У меня есть Executor внутри которого я запускаю Callable, мне нужно заблокировать методом wait конкретный Callable, а точнее его поток, но блокиреутся вся группа потоков почему-то, в таком случае я решил сделать Thread.currentThread().wait(), что меня удовлетворяло, но теперь нельзя оживить поток при необходимости методом notifyAll() Как это исправить?
Может, лучше использовать более высокоуровневые примитивы синхронизации? Кроме того, если в Executor 1 поток, "другой поток" его уже никак не разбудит. Это какое-то неправильное использование Executor, если имеет значение, в каком потоке выполняется Callable.

Vitaly
16.08.2018
09:19:09
так как тогда один callable уведомит другой, не имея на него ссылки?
Кстати, вопрос немножко не по теме, но зачем усыплять и пробуждать потоки через ключ типо: synchronized(lock){ lock.wait() }

Quantum Harmonizer
16.08.2018
09:20:30
Vladimir
16.08.2018
09:20:30
Quantum Harmonizer
16.08.2018
09:20:42
все блокировки в итоге сводятся к нему

Vitaly
16.08.2018
09:20:56
Google
Vitaly
16.08.2018
09:21:07
Почему нельзя написать просто wait()

Тот же самый callable.notifyAll() сделать после

Vyacheslav
16.08.2018
09:23:30
Почему нельзя написать просто wait()
потому что wait не работает вне блока синхронизации

выдаст ошибку

Vladimir
16.08.2018
09:25:08
Почему нельзя написать просто wait()
ну, wait всегда вызывается в многопоточной среде и после проверки определенного условия. Отсутствие синхронизации может привести к возникновению check-then-act race condition, когда поток войдет в состояние ожидания в том случае, когда условие, приводящее к ожиданию, ложно. А это может привести к неприятным последствиям. Пример: Продьюсер-консьюмер, очередь длиной 1. 1. Потребитель вызывает poll() и видит, что очередь пустая, переходит в состояние ожидания. 2. Перед вызовом wait() продюсер добавляет элемент в очередь и вызывает notify. 3. Потребитель уходит в ожидание после уведомления, хотя элемент в очереди существует. 4. Производитель добавляет элемент в очередь, но поскольку она заполнена, он блокируется. результат - оба треда заблокированы без возможности разблокировки.

Vitaly
16.08.2018
09:25:11
выдаст ошибку
Не выдаёт

Quantum Harmonizer
16.08.2018
09:27:53
Не выдаёт
ошибку компиляции не выдаёт, а вот на рантаймке грохнется

Vitaly
16.08.2018
09:28:48
ошибку компиляции не выдаёт, а вот на рантаймке грохнется
И этого не происходит, wait() работает стабильно, впринципе я считаю ответ Владимира праильным и достаточно доходчивым

public void insertMessage(Message message){ String uuid = message.addressId; if (getNicknameById(uuid) == null) new ServerPostman().postRequest(new AddressRequest(uuid)); Future future = service.submit(() -> { while (getNicknameById(uuid) == null) synchronized (lock){ lock.wait(); } MessageDao messageDao = App.getInstance().getDatabase().messageDao(); messageDao.insert(message); return null; }); try { future.get(); App.getInstance().getResponseListeners().getContactUpgradeBus().onUpdateLastMessage(message.addressId, message.text); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } public void insertAddressee(Addressee addressee) { Future<Object> future = service.submit(() -> { AddresseeDao addresseeDao = App.getInstance().getDatabase().addresseeDao(); addresseeDao.insert(addressee); synchronized (lock){ lock.notifyAll(); } return null; }); try { future.get(); App.getInstance().getResponseListeners().getContactUpgradeBus().onLoadContacts(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } }

Он не пробуждает

Vyacheslav
16.08.2018
09:30:00
Vitaly
16.08.2018
09:30:17
Когда я делаю без ExecutorService всё работает так как нужно, никаких проблем, но с Executor никак

Vitaly
16.08.2018
09:31:11
service - это объект типа ExecutorService

Mikhail
16.08.2018
09:32:44
service - это объект типа ExecutorService
инициализацию покажите

Vitaly
16.08.2018
09:33:15
protected static ExecutorService service = Executors.newFixedThreadPool(2);

Mikhail
16.08.2018
09:35:15
protected static ExecutorService service = Executors.newFixedThreadPool(2);
хорошо, вы также можете попробовать использовать https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html

Google
Alessio
16.08.2018
09:46:12
товарищи! Вопрос! Csv файл проще на фронте сгенерить или на беке?

Grigoriy
16.08.2018
09:46:40
Vitaly по каким условиям одни потоки должны будить другие?

Vladimir
16.08.2018
09:47:15
Он не пробуждает
если не пробуждает, то, скорее всего, уведомление происходит до ожидания, как бы очевидно это не звучало

(либо вообще не происходит)

Vitaly
16.08.2018
09:48:01
Admin
ERROR: S client not available

Vladimir
16.08.2018
09:48:59
значит, после уведомления условие getNicknameById(uuid) == null снова истинно

Mikhail
16.08.2018
09:49:05
Это к сожалению совсем не то что нужно
Ок. Вам виднее. А не может быть такого, что из-за маленького размера пула у вас все залочилось?

Vladimir
16.08.2018
09:49:09
и поток снова входит в ожидание

Vitaly
16.08.2018
09:50:20
Vitaly по каким условиям одни потоки должны будить другие?
Код имеет следующую логику: Если в БД нет пользователя, то отправляй запрос на получение пользователя и блокируй поток для отправки сообщения, приходит (уже в другой поток) сообщение с пользователем, он заносится в БД, после вызывается пробуждение потоков и по сути он должен быть уже не null

Кстати, сейчас проверю, заносится ли в БД пользователь

Grigoriy
16.08.2018
09:51:14
а зачем блокировать поток для отправки? он какой-то долгоживущий?

Vitaly
16.08.2018
09:52:17
а зачем блокировать поток для отправки? он какой-то долгоживущий?
Потому что дальше планируется отобразить сообщение

А для него необходим адресант

Чёрт, почему-то не происходит добавление в БД, поэтому и поток не просыпается

guga
16.08.2018
09:53:16
Vitaly
16.08.2018
09:53:22
Проблема видимо совсем в другом, а я с этим парюсь

Alessio
16.08.2018
09:53:24
да

Grigoriy
16.08.2018
09:53:29
бывает

Google
Alessio
16.08.2018
09:53:44
@guga4ka с бека прилетает дто и рисуется на фронте

сейчас стоит вопрос - где проще сгенерить эту csv

guga
16.08.2018
09:54:09
да
тогда можешь на фронте сгенерить, но учти, лично я тебя прокляну

подумай о мобильных пользователях

Alessio
16.08.2018
09:54:29
пф, я не фронтенд разработчик)

а что с ними?

guga
16.08.2018
09:55:26
короче, в любом случае, лучше дернуть эндпоинт и получить cvs в лицо

Alessio
16.08.2018
09:55:53
так так же по сути и делается

guga
16.08.2018
09:56:08
даже если у тебя на фронте есть все данные, это операция займет сколько-то памяти и процессорного времени

Alessio
16.08.2018
09:56:10
просто надо перевеси html страницу в csv форму

ну дела)

Mikhail
16.08.2018
09:56:36
Проблема видимо совсем в другом, а я с этим парюсь
У вас задача, которая кладет в бд отрабатывает?

guga
16.08.2018
09:56:47
ты уверен, что потребителями твоего апи будет только этот конкретный js код?

Alessio
16.08.2018
09:57:09
да

guga
16.08.2018
09:59:11
в любом, случае, я за бэкенд, а ты как хочешь

Alessio
16.08.2018
09:59:23
эх. придеться страдать

Akim
16.08.2018
10:05:40
Я за бек. Если данных станет много, на фронте будут проблемы

Страница 2735 из 2890