如何调用java 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 } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |