线程退出while循环后的android守护程序线程

时间:2013-09-05 05:54:30

标签: android multithreading handler message-queue

一直有一个困扰我的问题。 考虑以下。此工作线程读入字符以解析命令,直到布尔_readingEnabled为false。线程应该终止,但是当我查看调试器时,它会变成一个守护程序线程并且它会导致问题,因为应该始终只有一个连接。理想情况下,线程应该通过重新连接作为新线程重新启动,并且不存在其他重复线程。

FileDownloaderActivity extends Activity{
    TelnetClient _telnet;
    Inputstream _in;
    Outputstream _out;
    boolean _readingEnabled = true;
    onCreate(){
               startReadThread();
              }

    startReadThread(){
              Thread readingThread = new Thread(new Runnable(){
              run(){
              //connect _telnet, _in and _out
              while(true){
                  if (_readingEnabled){
                     char c = in.read();
                     //some string operations
                    }
                 else{
                     break;
                    }
              }
              print("reading thread exited");
              _readingEnabled = true ; //the thread will be restarted
              });
            }
             readingThread.start();
              }
}

我有另一个工作线程,它开始在FileDownloaderActivity的函数中下载文件。处理程序绑定到UI线程(这有关系吗?)。消息确实成功执行。

downloadFiles(){
        Handler handler = new Handler(){ //part of the UI thread execution
            void handleMessage(Message m){
                startReadThread(); //restart the reading thread
          }
     }

        Thread downloaderThread = new Thread(new Runnable(){
            run(){    
                _readingEnabled = false; //should kick out of the while loop in the other thread
               //download files...
              handler.sendMessage(new Message()); 
               }
        });
    }

我观察到的行为是新的ReadingThread在旧的ReadingThread终止之前开始执行。旧的ReadingThread会打印出“读取线程退出”,但它会成为一个守护程序线程。如果我继续执行另一组下载文件,我最终会得到两个守护程序读取线程,依此类推,直到连接失败。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果您设置_readingEnabled = false的唯一地点位于downloaderThread.run(),那么您可以让readThread无限期地运行,即

          while(true){
              if (_readingEnabled){
                 char c = in.read();
                 //some string operations
                }
             else{
                 Thread.sleep(100);
                }
          }

如果您的应用程序正在使用套接字,则使用Netty可能会获得更多成功。

来自Netty主页:

  

Netty是一个NIO客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化并简化了TCP和UDP套接字服务器等网络编程。