public class ThreadPre {    
    public static void main(String[] args) throws IOException {
        ServerSocket socket = new ServerSocket(80);
        
        while(true){
            final Socket connection = socket.accept();
            
            Runnable task = new Runnable() {
                
                @Override
                public void run() {
                
                    handle(connection);
                    
                }                
            };
            
            new Thread(task).start();
        }
    }}
这是我在《Java并发编程实践》看到的例子,我的疑问是socket用final声明虽然是基本语法要求的,因为不声明final的话,匿名类的函数没法直接引用该局部变量。但是accept每次收到一个连接请求都会返回一个新的socket,那么声明成final的话,接受完第一个请求,返回第一个socket后,就不能改变这个引用了,怎么接受新的socket呢

解决方案 »

  1.   

    不能改变引用。但是,你上面程序里并没有改变这个引用而是每次循环都创建了一个新的引用Socket connection。
      

  2.   

    final修饰只是说明connection的指向是不能改变的
      

  3.   

    既然不能改变引用,那怎么接受每次循环都创建了一个新的引用Socket connection
      

  4.   

    final Socket connection = socket.accept();是在循环之内,表明每次都是创建的新个连接。而connection这个变量已经不是上个循环的变量了
      

  5.   

    你的意思是说每次循环都声明了一个final Socket connection 吗?