gpt4 book ai didi

Java Thread.sleep 泄漏线程?

转载 作者:搜寻专家 更新时间:2023-11-01 01:04:12 24 4
gpt4 key购买 nike

所以我继承了一些等待来自网络源的通信的代码。

当它等待来自网络套接字的更多数据时,Thread.sleep(10) 被调用。这似乎导致了线程泄漏,正如 jconsole 和我在这里的线程转储所报告的那样(Thread-68、Thread-385 等有数百个条目......但为了简洁起见我缩短了):

Wed Jan 18 09:14:40 PST 2012
2012-01-18 09:14:50
Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.0-b11 mixed mode):

"Thread-69" daemon prio=10 tid=0x00007f01a047c800 nid=0x3725 waiting on condition [0x00007f019eaf4000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.unitt.framework.websocket.simple.NetworkSocket.run(NetworkSocket.java:304)
at java.lang.Thread.run(Thread.java:662)

"Thread-68" daemon prio=10 tid=0x00007f01a0500000 nid=0x371c waiting on condition [0x00007f019ecf6000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.unitt.framework.websocket.simple.NetworkSocket.run(NetworkSocket.java:304)
at java.lang.Thread.run(Thread.java:662)

有问题的代码:

public class NetworkSocket implements NetworkSocketFacade, Runnable
{

... removed many irrelevant methods

public void run()
{
byte[] readBuffer = new byte[512 * 1024];
while (isRunning)
{
//ioLogger.debug("in while(isRunning) loop");
try
{
int length = input.available();
if (length > 0)
{
int read = input.read(readBuffer, 0, readBuffer.length);

if (read < 0)
{
isRunning = false;
//@todo: do we disconnect?
ioLogger.debug("setting isRunning FALSE after read < 0");
}
else
{
//read data and process
}
}
else
{
//ioLogger.debug("nothing to read, sleeping");
try
{
Thread.sleep( 10 );
}
catch ( InterruptedException e )
{
//do nothing, keep going
}
}
}
// some catch blocks and logging after this

我有些担心以这种频率调用 sleep 会导致问题,我已经尝试将 sleep 时间从 10 增加到 250 来缓解这种情况。这确实在一定程度上改善了问题,但随着时间的推移,我仍然遇到同样的问题 - 我不断泄漏线程,直到我用完堆空间。

有没有人对这种行为有任何见解?我不认为像 Thread.sleep() 这样基本的东西会导致这样的问题。

最佳答案

Thread.sleep() 肯定不是问题。它不会创建任何线程等。

我只能猜测 isRunning 从未设置(或者由于同步不佳导致更改不可见)并且在旧线程仍在运行时创建了新线程。

顺便说一句,与其不断调用 available 并 hibernate 线程,不如简单地阻塞在 input.read() 上。代码会更简单,响应更快。

关于Java Thread.sleep 泄漏线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8914735/

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