ran*_*ght 2 java multithreading
我正在尝试编写一个游戏,其中我有一个Table类,每个坐在桌子上的人都是一个单独的线程.游戏涉及人们传递令牌,然后在派对铃声响起时停止.
我如何编程run()方法,以便一旦我启动人员线程,他们不会死亡,直到游戏结束时还活着
我尝试过的一个解决方案是在run()方法中使用while(true){}循环,但这会将CPU利用率提高到60-70%左右.有更好的方法吗?
虽然是的,你需要一个循环(while只有一种方式,但它是最简单的)你还需要在循环中放置一些等待事情发生并响应它们的东西.你的目标是拥有类似这样的伪代码:
loop {
event = WaitForEvent();
RespondToEvent(event);
} until done;
Run Code Online (Sandbox Code Playgroud)
好吧,这是40,000英尺的视野(一切看起来像蚂蚁!)但它仍然是你想要的核心.哦,你还需要一些东西来启动游戏的第一个事件,显然.
那么,关键就变成了定义WaitForEvent().经典之作是使用队列来保存事件,并从队列中进行阻塞读取,以便事情等到其他事件将事件放入队列中.这的确是一个并发-101的数据结构,但一个ArrayBlockingQueue是已经正确定义,所以是什么,我想在我的第一个执行使用.您可能希望在Thread的子类中隐藏它的用法,也许是这样的:
public abstract class EventHandlingThread<Event> extends Thread {
private ArrayBlockingQueue<Event> queue = new ArrayBlockingQueue<Event>();
private boolean done;
protected abstract void respondToEvent(Event event);
public final void postEvent(Event event) throws InterruptedException {
queue.put(event);
}
protected final void done() {
done = true;
}
public final void run() {
try {
while (!done) {
respondToEvent(queue.take());
}
} catch (InterruptedException e) {
// Maybe log this, maybe not...
} catch (RuntimeException e) {
// Probably should log this!
}
}
}
Run Code Online (Sandbox Code Playgroud)
子类,对于您的每个任务,您应该能够很好地完成任务.postEvent()其他线程调用该方法来发送消息,done()当您确定足够的时候,您可以调用自己.你还应该确保你总是得到一些可以发送的事件来终止事情,这样你就可以退出游戏......
| 归档时间: |
|
| 查看次数: |
2903 次 |
| 最近记录: |