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();
}
}}
请问上面的代码socket为什么要用final声明?这是我在《Java并发编程实践》看到的例子,请解释下

解决方案 »

  1.   

    不声明final的话,匿名类的函数没法直接引用该局部变量。
      

  2.   

    你去掉final一编译就知道了,报错如下:
    ThreadPre.java:21 错误:从内部类中访问本地变量connection;需要被声明为最终类型
                                  handle(connection);
                                               ^所以,楼上正解
      

  3.   

    这个和hibernate的自定义查询方法一样
    public List<XXX> findDaysGroupBy(final Long userId) {
    return (List<XXX>) super.getHibernateTemplate().executeFind(
    new HibernateCallback() {
    @SuppressWarnings("deprecation")
    public Object doInHibernate(Session session){