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

标签 java multithreading sockets

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

相关文章:

JavaMail - 如何设置与 DATA 中的 “RCPT TO:” header 不匹配的 SMTP “To:”

java - Jenkins 插件 : Select filled by model

java - 在线程之间传递信息的最佳方式是什么?

java - 为什么当线程阻塞时 ExecutorService 仍继续执行?

multithreading - 用户级线程无锁编程的实用性

java - midp 的插槽有限?

c - 为什么在结构和套接字创建中提到套接字的地址族?

java - 如何在 GWT 中获取我的 TabPanel 的选定选项卡

java - 线程 "main"java.lang.RuntimeException : Matrix is singular 中的异常

c - WinSock - UDP 广播监听器