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

ran*_*ght 2 java multithreading

我正在尝试编写一个游戏,其中我有一个Table类,每个坐在桌子上的人都是一个单独的线程.游戏涉及人们传递令牌,然后在派对铃声响起时停止.

我如何编程run()方法,以便一旦我启动人员线程,他们不会死亡,直到游戏结束时还活着

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

Don*_*ows 5

虽然是的,你需要一个循环(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()当您确定足够的时候,您可以调用自己.你还应该确保你总是得到一些可以发送的事件来终止事情,这样你就可以退出游戏......