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

Java 只要ArrayList中有元素,如何使用线程执行函数?,java,multithreading,networking,arraylist,Java,Multithreading,Networking,Arraylist,我试图将我的客户端网络处理代码移动到另一个线程中,这样它在处理数据包时就不会挂起主线程 基本上我有一个接收到的数据包的数组列表。线程运行无限while循环,处理任何新数据包。然而,这使我的CPU高达100%,因为即使没有新的数据包,它仍然会连续循环 我想做的是让处理线程休眠,我的线程在有新数据包时通知它 我正在用Java编写代码 编辑: 这就是我努力实现的目标- // Main Thread // Listener public void newPacketReceived(){ rec

我试图将我的客户端网络处理代码移动到另一个线程中,这样它在处理数据包时就不会挂起主线程

基本上我有一个接收到的数据包的数组列表。线程运行无限while循环,处理任何新数据包。然而,这使我的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 
    }
}
//主线程
//听众
public void newPacketReceived(){
receiverThread.addNewPacketToProcessingQueue(null);
}
//接收线
ArrayList processingQueue=新建ArrayList();
public void addNewPacketToProcessingQueue(GamePacket数据包){
processingQueue.add(数据包);
this.notify();
}
公开募捐{
while(true){
//处理数据包
this.sleep();//在通知线程之前睡眠
}
}

不要使用
数组列表
,而是使用某种描述(例如)。这正是为这种用例设计的

生产者代码将使用
offer
来提供一个新元素,处理线程将使用
poll
并在元素出现之前暂停(便宜)。

您可以在等待输入的同时简单地执行

它可能不是最优雅的设计,因为线程仍然会消耗一些资源,但它会防止处理器死机


如果您担心等待时会浪费时间,可以尝试
Thread.sleep(0)
。通常情况下,这不是一个好的实践,但对于游戏来说,有时会用到它(至少在其他语言中是这样——我还没有在Java上尝试过)。在某些系统上,这将简单地放弃时间片。

如果没有一些代码,这将很难提供帮助,但我的建议是让一个线程与do…while(ArrayList.size()>0)一起运行,然后运行另一个线程以不断检查阵列的大小,如果添加了填充,它将启动第一个线程,并在达到零时停止


希望这能有所帮助。

这是一款实时游戏,所以我不想浪费任何时间来处理潜在的重要问题data@LiamE-p:更新后的版本更适合游戏。这取决于它正在处理的数据类型。如果是视频或物理数据,您可以尝试使用对屏幕刷新/时间片有效的值。请您解释一下如何将其用于我在问题中提供的(新)伪代码?@LiamE-p:对不起,没有,我现在没有时间。但是找到一个关于它的教程应该不会太难,如果你看看javadoc,你会发现一个生产者-消费者问题的工作示例。在您的例子中,主线程是生产者,而接收方线程是消费者