我正在尝试将我的客户端网络处理代码移动到另一个线程中,因此在处理数据包时它不会挂起主线程。
基本上我有一个收到的数据包的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
}
}
答案 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),然后运行另一个运行的线程来不断检查数组的大小,如果添加了东西,它将启动第一个线程并在达到零时停止它。
希望这有帮助。