加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何调用java Runnable对象的其他方法?

发布时间:2020-12-15 05:07:08 所属栏目:Java 来源:网络整理
导读:我得到了一些我必须实现的类的骷髅(我个人并不真正同意程序的设计,但我不怜悯改变它:()并且他们以这种方式工作: 我有一个Game类,它实现了Runnable并代表了一个国际象棋游戏. Server类将包含它跟踪的多个Game类的列表. 好吧,这是有道理的,Game实现了Runnable
我得到了一些我必须实现的类的骷髅(我个人并不真正同意程序的设计,但我不怜悯改变它:()并且他们以这种方式工作:

我有一个Game类,它实现了Runnable并代表了一个国际象棋游戏.

Server类将包含它跟踪的多个Game类的列表.

好吧,这是有道理的,Game实现了Runnable,因此Server可以将每个游戏放在自己的线程中.

我对java的线程如何工作有点困惑.

我所知道的是以下内容:

在将我的Runnable类绑定到一个线程并调用.start()方法之后,调用Runnable类的run()方法.

但是,我在Game类中有一些其他方法,例如:

capturePiece()

playerMakesMove()

等等

在当前的设计中,由服务器来处理游戏操作.当玩家想要捕获一块时,服务器将调用game.capturePiece().

在这种情况下,capturePiece()是在Game线程还是Server的线程上运行? (调用者的线程或被调用者的线程)

在这种情况下,run()甚至会做什么?

解决方法

任何编程语言中的任何方法都在与调用者相同的线程中执行.当你调用Thread.start()时,它会在调用它的同一个线程中运行.

现在,您知道Thread的run()方法不会在与start相同的线程中执行.但那是因为start本身并不会调用run.您将不得不阅读更多有关线程的信息以获得完整的图片,但只是想象一下,start只创建一个带有一些数据结构的新线程(Runnable),新创建的线程查看该数据结构,识别Runnable并执行其运行方法.

这实际上是控制从一个线程传递到另一个线程的唯一方式:一个线程生成一些数据,另一个线程拾取并处理它.控制不会从一个线程传递到另一个线程,它是线程间的通信和协调.

如果Game的方法被Server调用,那么线程就没有任何事情可做了,是吗?但相反,如果服务器不直接调用该方法,而是将该操作表示为数据,则Game.run()可以在其自己的线程中选择操作并执行它.

现在唯一的问题是服务器在哪里可以放置数据,以便在自己的线程中运行的每个Game.run()都知道从中获取数据.一种选择是使用BlockingQueue.服务器可以将这些Action对象放入队列中,Game线程可以将其拾取.这两个人如何知道使用相同的队列?有许多不同的方法,一种是服务器用队列创建游戏并在其侧面存储地图.如下面的骨架:

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
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读