如果你对一个线程 start 了,那你的程序中实际上有两个线程,还有一个main
当前线程是main的子线程,实际上运行时,子线程start以后,main的方法还是会继续往下执行,直到退出,当main退出以后,子线程也就死了,当你将死循环写在子线程里,相当与子线程死掉了,但不影响主线程的执行,主线程遇到退出一样退出了程序,当你写在主线程里的死循环,那就在那里循环,因为它没有退出语句 System.exit(0); 或者执行到了最后一个大括号
是这样的,ss.accept()方法是阻塞的,也就是说ss所在的线程运行到accept()函数就会一直等待,直到ss接收到了一个Socket请求。正因为accept()是阻塞的,所以一般会把这个函数放在一个单独的线程,这样就不会影响主线程(例如程序界面)的运行,Socket编程几乎是肯定和多线程编程一起用的。accept()放进了单独的线程了自然就不会影响后面代码的执行,因为这时accept()的时间片和后续代码的时间片会由JVM调配,而不是按照代码编排的先后顺序了。
另外你对死循环的理解有偏差,所谓死循环是指循环条件永远为真而导致循环一直不结束,而由于循环内部的方法阻塞导致的循环不结束不属于死循环,这两个有本质的差别。通常Socket.accept()是该放进一个死循环的,也就是你的while(true);
while(true)的循环中能跳出来的原因,无非这几个:break语句、抛出的exception。
显然代码中没有break,那么问题就在ss.accept()了。这是个能抛出异常的语句(start()是不是也抛?记不清了)。
一旦有异常抛出,代码就不再继续执行,而是被try、catch(Exception)了,执行ee.printStackTrace(); 然后继续执行后面的代码。
所以就出循环了。
完毕~
ss.accept(); 是阻塞当前线程的。就是说每次执行到ss.accept()是这个线程就会停在这里,知道有客户端的socket与它链接才会向下执行,继续下一次循环。
不明白你是想问什么?不知道是不是对你有用。
ss.accept();方法在没有客户端连接时会进入阻塞状态,所以循环到这步时代码就不再执行了等待客户端连接,所以不会死循环.普通的方法,肯定会循环执行到死...