Java Thread.sleep泄漏线程?

AWT*_*AWT 4 java memory-leaks sleep thread-sleep

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

当它正在等待来自网络套接字的更多数据时,会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)
Run Code Online (Sandbox Code Playgroud)

有问题的代码:

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
Run Code Online (Sandbox Code Playgroud)

我担心用这个频率调用睡眠可能会导致问题,我尝试将睡眠时间从10增加到250只是为了缓解这种情况.这确实有所改善,但随着时间的推移,我仍然遇到同样的问题 - 我一直在泄漏线程,直到我没有堆空间.

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

Tom*_*icz 9

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

我只能猜测isRunning从未设置(或由于同步性差而无法看到更改)并且在旧的线程仍在运行时创建新线程.

BTW而不是不断调用available和休眠线程可以简单地阻止input.read().代码会更简单,响应更快.


NPE*_*NPE 6

问题不在于Thread.sleep(),它与线程的逻辑有关.

从您发布的代码中,线程将在何时终止isRunning = false.现在,唯一的办法isRunning被设置为falseinput.available()返回正值,随后input.read()返回一个负值.

在那种情况下似乎没有任何世界状态.

因此,使用此run()方法的所有线程都将在该进程存活期间存活,并且大部分时间都在其中Thread.sleep().

PS这是基于您发布的代码.如果办法isRunning将被设置为false你目前没有显示,请更新您的问题.