gpt4 book ai didi

java - 让线程在 Java 应用程序中无限期运行

转载 作者:行者123 更新时间:2023-12-01 00:39:45 25 4
gpt4 key购买 nike

我正在尝试编写一个游戏,在该游戏中我有一个 Table 类,每个坐在 table 旁的人都是一个单独的线程。游戏涉及人们传递代币,然后在聚会钟声响起时停止。

我如何对 run() 方法进行编程,以便一旦我启动了人员线程,它们就不会死亡并且一直存活到游戏结束

我尝试过的一种解决方案是在 run() 方法中使用 while (true) {} 循环,但这会将我的 CPU 利用率提高到 60-70% 左右。有没有更好的方法?

最佳答案

虽然是的,您需要一个循环(while 只是一种方式,但它是最简单的)您还需要在循环中放置一些东西,以等待事情发生并响应它们。你的目标是拥有这样的伪代码:

loop {
event = WaitForEvent();
RespondToEvent(event);
} until done;

好的,这就是 40,000 英尺(那里的一切看起来都像 Ant !)的景色,但它仍然是您想要的核心。哦,很明显,您还需要一些东西来触发开始游戏的第一个事件。

所以,关键就变成了 WaitForEvent() 的定义.经典的做法是使用队列来保存事件,并从队列中进行阻塞读取,以便等待其他东西将事件放入队列。这实际上是一个 Concurrency-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!
}
}
}

为您的每项任务创建子类,您应该能够顺利进行。 postEvent()方法被其他线程调用来发送消息,你调用 done()当你决定够了的时候,就靠自己。你还应该确保你总是有一些可以发送的事件来终止事情,这样你就可以退出游戏......

关于java - 让线程在 Java 应用程序中无限期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2983973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com