Любой метод на любом языке программирования выполняется в том же потоке , что и вызывающий.Когда вы вызываете Thread.start()
, он запускается в том же потоке, который его вызвал.
Теперь вы знаете, что метод потока run()
не выполняется в том же потоке, что и start
.Но это потому, что start сам по себе не вызывает run .Вам нужно будет прочитать больше о потоках, чтобы получить полную картину, но только представьте, что start только создает новый поток с некоторой структурой данных (Runnable
), а недавно созданный поток просматривает эту структуру данных, идентифицирует Runnable и выполняетего run
метод.
И это действительно способ управления only , который передается из одного потока в другой: один поток генерирует некоторые данные, а другой - получает и обрабатывает их.Управление не переходит от одного потока к другому, это межпотоковое взаимодействие и координация.
Если методы Game
вызываются Server
, то потокам не нужно будет что-то делать, не так ли?Но вместо этого, если Сервер не вызывает метод напрямую, а вместо этого представляет действие как данные, тогда Game.run()
может выбрать действие и выполнить его в своем собственном потоке .
ТеперьЕдинственный вопрос - куда можно Server
поместить данные так, чтобы каждый Game.run()
, работающий в своем собственном потоке, знал, как их забрать.Одним из вариантов является использование BlockingQueue .Сервер может поместить эти Action
объекты в очередь, а игровой поток может их забрать.Как они узнают, чтобы использовать одну и ту же очередь?Есть много разных способов, один для сервера, чтобы создать игру с очередью и сохранить карту на ее стороне.Как в скелете ниже:
class Server {
Map<Game, BlockingQueue> games = ....;
void createGame() {
BlockingQueue queue = ....;
Game game = new Game(queue);
games.put(game, queue);
}
void foo() {
Game game = ....;
Action action = ....; // identify the Game
map.get(g).add(action);
}
}
class Game {
BlockingQueue _queue;
Game(BlockingQueue queue) {
_queue = queue;
}
void run() {
while (true) {
Action nextAction = _queue.take();
// perform the action
}
}
}