1

我正在写一个模拟香蕉图的乐趣。我想使用并发,但我不完全确定如何。

我在一个Game类中有一个主要方法。每个播放器线程都致力于解决方案。在某些时候,玩家会“剥皮”。在此操作期间,每个玩家都会得到一个新的牌。播放器线程之一必须通知该Game线程。

伪代码看起来像这样:

while (no player has reported they are finished) {
      if (player reports it is time to peel) {
           everyone peel 
      }
      everyone work towards completion of puzzle
}

如何在 Java 中实现这一点?(我不一定要寻找完全充实的解决方案,只需指出正确的方向。)我想如何处理对象之间的通知?

澄清一下:这不是一个用户交互游戏。我只是想尝试不同的算法,看看哪种算法能最快地解决问题。如果有的话,“游戏”将编写一个算法并将其插入以查看它是如何工作的。

4

3 回答 3

5

这将是使用Cyclic Barrier的好地方。

本质上,循环障碍让线程做一些工作,然后让所有线程等到它们都到达同一点,然后每个线程再次启动。

因此,您可以让每个玩家剥离,然后调用 CyclicBarrier.await()。然后,所有线程将等待,直到每个线程都到达该点。这似乎是你想要的。

(此外,您显然并不需要为此并发 :)

于 2009-12-26T07:44:32.083 回答
1

观察者模式可能是合适的。每个人都向主线程注册以接收有关剥离事件的通知。当有人报告该剥离时,他通知主线程,而主线程又通知所有已注册的线程。通知可以通过一个特殊的线程局部变量(每个玩家线程都有自己的)来完成,该变量由主线程通过方法调用设置,并在游戏循环的每次迭代中由玩家线程检查。

编辑:这是一篇文章的链接,该文章更深入地介绍了在 Java 中以多线程方式实现观察者模式。 http://www.javaworld.com/jw-03-1999/jw-03-toolbox.html

于 2009-12-26T06:44:25.200 回答
1

根据您的流程的具体情况,您可能不需要进行线程处理(相信我,这是您宁愿避免的事情,无论大孩子们做得多么酷和有趣)。

解决该问题的一种方法是设置事件队列。

在伪代码中

 enum EVENTTYPES = {PEEL=0, WORK=1};
 struct Event = {
     int eventType;
     int* data;
 }

 filoQueue eventQueue;

 array sQuidPlayers = [new Squid(), new Squid(), new Squid()];
 void eventLoop () {
      int player;
      for each player in sQuidPlayers {
          eventQueue.push(new Event(EVENTTYPES.WORK, player.id));
      }

      for each event in eventQueue {
           game.doEvent(event)
      }

 }

所以在这里你每秒运行事件循环 25 次、30 次或 60 次,无论你想以何种帧速率运行。你为此使用了一个计时器(我确定在某个地方的 java 中有一个)

然后 doEvent 将尝试在对应的播放器实例上查找一些对应的方法。Squid 类的 work 方法会做一些很小的工作,然后停止,在循环中等待下一次。阵列中的每个 Squid 都轮到他们做自己的一小部分工作。反过来,工作方法可以将 PEEL 事件放入事件队列中。此时,下一次循环时,可能会调用一些相应的剥离方法。也许在某个中心游戏类上,带有发起剥离事件的玩家的 id。您将如何分派这些事件的逻辑放入那里的 doEvent 方法中。doEvent 反过来可以将一个对象传递给每个事件接收者,以便接收者可以将自己的事件对象放入队列中,以便下次在循环中运行。(或者,“对于每个事件”

The trick is figuring out how to break your long running work into a tiny parcel of work, figure out how to save the results of that work, and pick it up later where you left off the next time the work method is called. If all the players are well behaved, they can all share a thread without getting stuck.

If you're going to go down the threaded path, the issues about who can access what bit of memory and when get a little bit more complicated.

于 2009-12-26T07:44:53.093 回答