只要ArrayList中有元素,如何使用Threads执行函数?

时间:2011-12-11 08:51:55

标签: java multithreading networking arraylist

我正在尝试将我的客户端网络处理代码移动到另一个线程中,因此在处理数据包时它不会挂起主线程。

基本上我有一个收到的数据包的ArrayList。线程运行无限循环,处理任何新数据包。然而,这使我的CPU达到100%,因为即使没有新的数据包,它仍然会持续循环。

我想要做的是让处理线程处于休眠状态,并且我的线程在有新数据包时通知它。

我是用Java编写的。

修改

这是我努力实现的目标 -

// Main Thread
// Listener
public void newPacketReceived(){
    receiverThread.addNewPacketToProcessingQueue(null);

}

// Receiver Thread
ArrayList<GamePacket> processingQueue = new ArrayList<GamePacket>();

public void addNewPacketToProcessingQueue(GamePacket packet){
    processingQueue.add(packet);
    this.notify();
}

public void run(){
    while(true){
        // Process Packets
        this.sleep(); // Sleep until thread is notified 
    }
}

3 个答案:

答案 0 :(得分:5)

使用某些描述的BlockingQueue(例如LinkedBlockingQueue),而不是使用ArrayList。这是为这种用例而设计的。

生产者代码将使用offer来提供新元素,并且处理线程将使用poll来超时阻塞(便宜)直到元素存在。

答案 1 :(得分:0)

在等待输入时,你可以简单地add a Thread.sleep(100) to your loop

它可能不是最优雅的设计,因为线程仍会消耗某种资源,但它会使处理器不会挂起。

如果您担心在等待时会浪费时间,可以尝试Thread.sleep(0)。通常情况下这不是一个好习惯,但对于游戏来说,它有时被使用(至少在其他语言中 - 没有在Java上尝试过)。在某些系统上,这只会放弃时间片。

答案 2 :(得分:0)

没有一些代码就很难提供帮助,但我的建议是让一个线程运行do ... while(ArrayList.size()&gt; 0),然后运行另一个运行的线程来不断检查数组的大小,如果添加了东西,它将启动第一个线程并在达到零时停止它。

希望这有帮助。