为什么这个线程只运行一次?

时间:2013-11-15 10:54:15

标签: java multithreading

我有一个服务器在一个单独的线程上运行,由于某种原因,它只在收到数据包时运行!它为什么这样做?它不应该连续运行吗?

public void run() {
    while (running) {
        System.out.println(true);
        byte[] data = new byte[1024];
        DatagramPacket packet = new DatagramPacket(data, data.length);
        try {
            this.socket.receive(packet);
        } catch (IOException e) {
            e.printStackTrace();
        }
        parsePacket(packet.getData(), packet.getAddress(), packet.getPort());
    }
}

我这样开始:

public static void main(String[] args) {
    GameServer server = new GameServer();
    server.start();
}

该类扩展了Thread。

3 个答案:

答案 0 :(得分:6)

socket.receive是一种阻止方法。所以代码在收到任何数据之前都在等待接收。

答案 1 :(得分:3)

来自here

public void receive(DatagramPacket p)
             throws IOException
  

从此套接字接收数据报包。当这个方法返回时,   DatagramPacket的缓冲区充满了收到的数据。该   数据报包还包含发送者的IP地址和端口   发件人的机器上的号码。

     

此方法将一直阻塞,直到收到数据报。长度字段   数据报包对象包含接收的长度   信息。如果消息长于数据包的长度,则   消息被截断。

它清楚地说方法阻塞并等待数据报。

答案 2 :(得分:3)

您的线程正常运行。方法DatagramSocket.receive(DatagramPacket)将阻塞,直到收到数据包。

默认行为是无限阻塞,直到收到数据包。您可以使用DatagramSocket.setSoTimeout(int)指定超时,如果您想定期记录是否收到数据包,或检查您的线程是否仍在运行。