Как называются другие методы Java Runnable объекта? - PullRequest
3 голосов
/ 24 сентября 2011

Мне даны некоторые скелеты классов, которые я должен реализовать (лично я не очень согласен с дизайном программы, но я не могу изменить его :(), и они работают таким образом:

У меня есть класс Game, который реализует Runnable и представляет игру в шахматы.

Класс Server будет иметь список из нескольких Game классов, которые он отслеживает.

Хорошо, это имеет смысл, Game реализует Runnable, поэтому Server может поместить каждую игру в свой собственный поток.

Я немного озадачен тем, как работают потоки Java.

Я знаю следующее:

После привязки моего класса Runnable к потоку и вызова метода .start() вызывается метод run() класса Runnable.

Однако в моем классе Game есть некоторые другие методы, такие как:

capturePiece()

playerMakesMove()

и т.д.

В текущем дизайне это до Server для обработки игровых действий. Когда игрок хочет захватить фигуру, Server назовет game.capturePiece().

В этом случае capturePiece() выполняется в потоке Game или в потоке Server? (нить звонящего или нить звонящего)

В этом случае, что бы вообще сделал run()?

Ответы [ 3 ]

6 голосов
/ 24 сентября 2011

Любой метод на любом языке программирования выполняется в том же потоке , что и вызывающий.Когда вы вызываете 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
        }
    }
}
5 голосов
/ 24 сентября 2011

@ Razor, как и в других обсуждениях, если класс реализует Runnable и метод run связан с длительным процессом, вы все равно можете вызывать другие методы класса. И это можно проверить так:

public class TestThreads {
   public static void main(String[] args) {
      TestGame testGame = new TestGame();
      new Thread(testGame).start();

      for (int i = 0; i < 10; i++) {
         testGame.otherMethod();
         try {
            Thread.sleep(1000);
         } catch (InterruptedException e) {}
      }
      System.out.println("done");
      System.exit(0);
   }
}

class TestGame implements Runnable {
   @Override
   public void run() {
      try {
         Thread.sleep(100 * 1000);
      } catch (InterruptedException e) {}
   }

   public void otherMethod() {
      System.out.println("in other method");
   }
}
2 голосов
/ 24 сентября 2011

В этом случае выполняется capturePiece () в потоке Игры или Тема сервера?

capturePiece будет запущен в ветке Game, где был вызван метод.

В этом случае, что бы вообще запустил ()?

Если сервер всегда вызывает метод в потоках игры, то вы можете сделать то же самое с одним потоком. Потоки будут полезны, если действия были вызваны каждым потоком Игры, который независимо вызывает Сервер для уведомления о результате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...