Вызов метода из одного потока в другой для выполнения в другом потоке - PullRequest
1 голос
/ 14 ноября 2011

Я делаю сервер в Java, который имеет соединение MySQL в другом потоке, так что он управляется событиями и не блокирует основной поток.

Пока он работает хорошо, он отлично работает длязапросы, которые не возвращаются (вставка и т. д.), но я не уверен, как реализовать метод обратного вызова, который будет выполняться в другом потоке.Если я просто вызываю метод из потока подключения к базе данных, этот метод запускается в этом потоке.

Как лучше всего это сделать?

Ответы [ 4 ]

3 голосов
/ 14 ноября 2011

Там java.util.concurrent.FutureTask.

Если нет, возможно, ваш поток БД мог бы реализовать пул команд / запросов и для каждой команды / запроса иметь возможность вызывать метод обратного вызова данного объекта, используя отражение. Это позволит неблокировать очереди команд и уведомление о завершении команды / запроса.

2 голосов
/ 14 ноября 2011

Вы можете использовать java.util.concurrent.Future и передать его объекту, который будет иметь дело с результатом

1 голос
/ 14 ноября 2011

Одним из механизмов является наличие очереди ( ConcurrentLinkedQueue ) из FutureTask экземпляров. Поток вашего приложения будет добавлять экземпляры в очередь, а затем опрашивать задачи на предмет завершенности. Ваш поток подключения к базе данных будет опрашивать очередь на предмет задач для обслуживания.

0 голосов
/ 14 ноября 2011

Обратный вызов обычно выполняется в другом потоке. Если вы хотите вызвать что-то в вызывающем потоке, я бы использовал ExecutorService с объектом Future. Если вам все равно, какой поток выполняет работу, я бы назвал его в потоке, который выполняет запрос к базе данных, или добавил задачу в другой пул потоков.

Вот несколько примеров использования ExecutorServices

http://tutorials.jenkov.com/java-util-concurrent/executorservice.html

...