gpt4 book ai didi

java - 为什么我的 Java 线程不同时运行?

转载 作者:行者123 更新时间:2023-12-01 10:44:05 25 4
gpt4 key购买 nike

我有一个正在与 UDP 服务器通信的应用程序。我的应用程序在一个端口(例如 1234)上监听并在另一个端口(例如 5678)上发送。我正在与之通信的 UDP 服务器还需要每 5 秒进行一次“心跳”,为此我创建了另一个线程。当我的应用程序首次启动时,我创建监听线程,然后创建心跳线程,然后开始发送 UDP 服务器消息包。然而,唯一的问题是,似乎我发出的所有数据包都在心跳线程启动之前完成。

这是我为听众准备的内容:

public class MyListener implements Runnable {
private volatile boolean run = true;
private DatagramSocket myDatagramSocket;
private DatagramPacket myDatagramPacket;
private byte[] receiveBuffer;
private int receiveBufferSize;

@Override
public void run(){
while(run){
try {
myDatagramSocket = new DatagramSocket(null);
InetSocketAddress myInetSocketAddress = new InetSocketAddress(1234);
myDatagramSocket.bind(myInetSocketAddress);

receiveBuffer = new byte[2047];
myDatagramPacket = new DatagramPacket(receiveBuffer, 2047);

myDatagramSocket.receive(myDatagramPacket);
byte[] data = myDatagramPacket.getData();

receiveBufferSize = myDatagramPacket.getLength();

switch(messageID){
...
}
} catch (Exception e){
}
}
}
}

这是我的心跳:

public class MyHeartbeat implements Runnable {
private volatile boolean run = true;
private HeartbeatSenderClass heartbeatSender;

@Override
public void run(){
while(run){
try {
TimeUnit.SECONDS.sleep(5);
heartbeatSender.sendHeartbeat();
} catch(Exception e){
}
}
}
}

这是我的主类(class):

public class MyApp {
public static void main(String[] args){
MyListener listener = new MyListener();
Thread listenerThread = new Thread(listener);
listenerThread.setName("Listener Thread");
listenerThread.start();

MyHeartbeat heartbeat = new MyHeartbeat();
Thread heartbeatThread = new Thread(heartbeat);
heartbeatThread.setName("Heartbeat Thread");
heartbeatThread.start();

MySender sender = new MySender();
Thread senderThread = new Thread(sender);
senderThread.setName("Sender Thread");
senderThread.start();
}
}

我的所有数据包都已到达 UDP 服务器,但并不像我想象的那样顺利。我本以为当我向服务器发送数据包时,每 5 秒我的心跳就会发出一次。然而,似乎我的心跳只有在我的数据包发送完成后才会消失。另外,我相信我没有从 UDP 服务器收到所有消息。我这样说是因为我已经嗅探了我的机器上的 UDP 数据包,并且我看到来自服务器的数据,但我的接收器没有接收/处理。有什么建议吗?

最佳答案

你心里有这样的想法:

 TimeUnit.SECONDS.sleep(5);
heartbeatSender.sendHeartbeat();

因此,在发送第一个节拍之前,您需要等待 5 秒。难怪其他线程同时完成他们的工作。

关于java - 为什么我的 Java 线程不同时运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34297861/

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