一直有一个困扰我的问题。 考虑以下。此工作线程读入字符以解析命令,直到布尔_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会打印出“读取线程退出”,但它会成为一个守护程序线程。如果我继续执行另一组下载文件,我最终会得到两个守护程序读取线程,依此类推,直到连接失败。有什么想法吗?
答案 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套接字服务器等网络编程。