A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 走遍世界找寻你 中级黑马   /  2013-11-16 22:24  /  816 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 走遍世界找寻你 于 2013-11-17 20:42 编辑

package itcast.interview.traffic;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Road {

        private List<String> vechicles = new ArrayList<String>();
        private String name=null;
        public Road(final String name){
                this.name = name;
                //模拟车辆不断随机上路的情况
                ExecutorService pool= Executors.newSingleThreadExecutor();
                pool.execute(new Runnable(){
                        public void run() {
                                for(int i = 1 ; i < 1000 ; i ++){
                                        try {
                                                Thread.sleep(new Random().nextInt(10)*1000);
                                        } catch (InterruptedException e) {
                                                
                                                e.printStackTrace();
                                        }
                                        vechicles.add(name + "_" + i);
                                }
                        }
                });
               
                ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
                timer.scheduleAtFixedRate(
                                new Runnable() {
                                        public void run() {
                                                if(vechicles.size() > 0) {
                                                        boolean lighted = Lamp.valueOf(Road.this.name).isLighted();;
                                                        if(lighted) {
                                                                System.out.println(vechicles.remove(0)+"is travelsing !");
                                                        }
                                                }
                                        }
                                },
                                1,
                                1,
                                TimeUnit.SECONDS);
        }
}
请问第十行name前如果不加不加final该怎么改才对?

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

2 个回复

倒序浏览
你说的是12行吧?第10行没有name啊?
因为你的Road类的构造方法中的第一个方法pool.execute()方法的最后一行代码:vechicles.add(name + "_" + i);使用到了变量name,你的这个方法中传入的是一个匿名内部类。内部类在调用外部类的局部变量时,局部变量是要被final修饰的,你是这么做的,没有问题。你想在构造方法的参数final String name前不加final,那么就让这个内部类访问外部类的成员变量就好了。可以访问成员变量name,因为this.name=name;这句代码把局部变量的值赋给了成员变量。
解决方法:vechicles.add(name + "_" + i);这句代码修改为:vechicles.add(Road.this.name + "_" + i);
之所以这样修改是因为内部类访问外部类的成员变量的格式就是这样,具体请参见毕老师的内部类视频。
回复 使用道具 举报 1 0
是的谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马