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

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

Павел
16.08.2018
07:53:41

Artjom
16.08.2018
08:14:20

Google

Artjom
16.08.2018
08:16:20

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
В Андроиде есть поддержка восьмой, но не все методы доступны на низких версиях апи

Grushin
16.08.2018
08:20:49
Или нет. Короче выше шестого

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 но просто каряво это очень.

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

Grushin
16.08.2018
08:26:17

Google

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

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

Vladimir
16.08.2018
09:10:26

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?

Vitaly
16.08.2018
09:14:44

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

Vladimir
16.08.2018
09:19:43

Vitaly
16.08.2018
09:19:46

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
выдаст ошибку

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
ну, wait всегда вызывается в многопоточной среде и после проверки определенного условия. Отсутствие синхронизации может привести к возникновению check-then-act race condition, когда поток войдет в состояние ожидания в том случае, когда условие, приводящее к ожиданию, ложно. А это может привести к неприятным последствиям.
Пример:
Продьюсер-консьюмер, очередь длиной 1.
1. Потребитель вызывает poll() и видит, что очередь пустая, переходит в состояние ожидания.
2. Перед вызовом wait() продюсер добавляет элемент в очередь и вызывает notify.
3. Потребитель уходит в ожидание после уведомления, хотя элемент в очереди существует.
4. Производитель добавляет элемент в очередь, но поскольку она заполнена, он блокируется.
результат - оба треда заблокированы без возможности разблокировки.
Спасибо огромное за подробный ответ

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


Vitaly
16.08.2018
09:28:48
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(); }
}
Он не пробуждает


Quantum Harmonizer
16.08.2018
09:29:08

Vyacheslav
16.08.2018
09:30:00

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

Mikhail
16.08.2018
09:30:58

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

Mikhail
16.08.2018
09:32:44

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

Mikhail
16.08.2018
09:35:15

Google

Vitaly
16.08.2018
09:45:35

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
Я за бек. Если данных станет много, на фронте будут проблемы