我有一个正在与 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/