当run()方法执行完成后,线程会自动关闭吗?

14

我目前正在开发我的游戏网络,有一个客户端和服务器正在运行。服务器当前在另一个Thread中无限循环,但我的客户端和游戏代码在同一个线程中。当客户端处理来自服务器的数据时,我遇到了问题,游戏会挂起直到客户端完成处理新数据包。

我尝试通过使客户端类实现Runnable并在单独的线程中运行来解决这个问题。我遇到了一些其他错误,不知道是否是这个问题导致的。

我有run方法和sendPacket方法:

public void run() {
    // empty
}

public void sendPacket() {
    somePacketSendingCode();
}

run方法中没有任何代码,因为我只使用sendPacket方法。当接收到数据包时,侦听器线程会调用sendPacket

如果我在run方法中没有任何代码,那么是不是表示客户端Thread在启动后停止执行?如果是这样的话,那么sendPacket方法不就什么也不做了吗?

3个回答

7
如果你没有在run方法中调用sendPacket方法,那么它将永远不会执行。线程会在run方法返回时停止。
请注意,只有run方法包含线程的实际代码。你在帖子中提到你有sendPacket方法,并且只使用该方法。这意味着你实际上没有并行运行任何内容。当你调用start()时,将启动一个并行线程,该线程异步地调用run方法。仅调用sendPacket并不是并行处理。

6
据我所知,当 run() 方法返回时,线程会停止运行。 线程状态

如果是这样,那么这是否意味着在 run 方法返回后,sendPacket 方法将不会执行任何操作? - liamzebedee
如果你的run()方法看起来像这样:code void run() { sendPacket(); } code,那么sendPacket只会被执行一次。 - codejitsu
它是这样的。 public void run(){} public void sendPacket(){/bleh/ }。当监听器线程接收到数据包时,将调用sendPacket。 - liamzebedee
你的run()方法是空的吗? - codejitsu
在这种情况下,您的线程会立即终止。sendPacket() 方法不会被调用。 - codejitsu

4

run()方法返回后,线程将终止。如果您已调用sendPacket,则发送的任何数据包将被传递给操作系统,它会继续传递数据包。未发送的任何数据包必须由另一个线程发送或丢失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接