LINUX.ORG.RU

java threading callbacks

 callbacks, ,


0

2

Нужно из потока дергать функцию наблюдателя, но нужно это сделать в потоке, в котором находится наблюдатель, например в gui потоке. Как правильно это сделать? Как я понял из доков syncronized(this) или что-то подобное мне тут мало чем поможет... или поможет?

SwingUtilities.invokeLater или как-то так.

dave ★★★★★
()

нужно это сделать в потоке, в котором находится наблюдатель, например в gui потоке

SwingUtilities.invokeLater или аналоги для других toolkits?

kamre ★★★
()

в яве методы не являются first-class functions, так что нельзя поставить синхронизацию на сам метод, и «вызвать метод из другого потока» в человеческом смысле тоже нельзя. Синхронизованный метод на самом деле означает синхронизацию на объект. Если юзается какой-то конкретный ресурс, например, массив, то можно сделать блок, синхронизованный относительного этого ресурса, например как здесь. Немного объяснений здесь. И в книжке Java Concurrency in Practice, конечно, но она длинная. Если ты пока не разбирался с синхронизацией вообще, отлично объясняет основы статья Программирование для падонков: Синхронизация процессов, которая (неизвестно, насколько насколько это правда) написана директором Xored :)

Если код не проприетарный, выложи здесь минимальный пример main(), демонстрирующий проблему («мне хотелось, чтобы тут были все нули, а на самом деле там какой-то мусор!»), а мы попробуем показать, как это исправить

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

ну кода там много. В общем плане: поток работает, заполняет массив строк, которые собирает у устройства по сети, в конце вызывает метод слушателя, void onDone(String[] arr). Слушатель должет обработать эту функцию в своем потоке, а не в том потоке откуда вызвано. Не важно гуи это поток или нет.

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

ну вот этот ваш runOnUiThread(runnable) можно заменить минимум двумя вариантами.

Первый уже говорил, просто new Thread(runnable).start() (в предыдущем посте ошибся малец, у runnable нет метода start(), надеюсь пинать никто не будет ;)

Второй - создать private final ExecutorService es = new FixedThreadPool(<число, например, 1, можно больше>);

и потом es.submit(runnable) и es.start()

В названии методов мог ошибиться, лениво в javadoc лезть, сами найдёте =)

BattleCoder ★★★★★
()
Ответ на: комментарий от pozitiffcat

в котором находится наблюдатель, например в gui потоке.

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

Если вам критично именно в GUI потоке выполнять, именно этот метод и нужен. Если переносите что-то на swing - копайте документацию по swing - там должен быть похожий метод.

Я описал как в _новом_ потоке запускать, думаю это не то, что вам нужно %)

Вы бы добавили что ли тег «android», а то вас сразу не поняли правильно ;) android != java

BattleCoder ★★★★★
()
Последнее исправление: BattleCoder (всего исправлений: 1)
Ответ на: комментарий от BattleCoder

спасибо за потраченное на меня время. В том то и дело, нужно что бы библиотека работала и в swing и в Android, и тупо в консоли, неважно, в bada там например. Поэтому ищу способ реализовать это именно средствами java, а не какими либо плотформенными API

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

Не получится. У ведроида свой UI с девицами и азартными играми. GUI-потоки разной природы что ли (по-разному создаются). Просто «в другом потоке» что-то выполнять - можно единообразно.

Можно вынести код куда-нибудь... и из андроида дёргать по-своему, из свинга по-своему...

Может и ошибаюсь, может и можно так сделать, но вы не одну неделю потратите на это %) android и java swing всё-таки разные.

BattleCoder ★★★★★
()
Ответ на: комментарий от pozitiffcat

Правильно ли понял, что тебе требуется сделать всего-навсего следующее: T1 сообщает Т2 о том что он выполнил некоторую работу, а Т2 получив такое сообщение начинает обрабатывать что-то? Пускай у Т2 будем очередь сообщений которые он должен обработать. Т1 вызывает onDone которая помещает в очередь Т2 новое сообщение. Т2 видит, что в очереди есть новое сообщение, извлекает и обрабатывает его.

anonymous
()
Ответ на: комментарий от pozitiffcat

T2 и T1 работают паралельно, T1 пишет в общий буфер, T2 извлекает данные с него и делает дела.

Когда T1 заканчивает работу (т.е. в буфере уже были все данные), говорим T2 (например .interrupt), что бы доделал дела с буфера и умер.

ShadowPrince
()

Нужно из потока дергать функцию наблюдателя, но нужно это сделать в потоке, в котором находится наблюдатель

Если вам нужно что б один поток узнал о том, что другой что-то сделал, то делаете флаг, доступный с обоих потоков, и пусть один в цикле проверяет флаг, а другой, его выставляет.

Если нужно передавать данные между потоками, то это можно делать или как предлагали через общий буфер, либо через PipedInputStream/PipedOutputStream

ya-betmen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.