黑马程序员技术交流社区

标题: 来人了看看怎么搞 [打印本页]

作者: 走遍世界找寻你    时间: 2013-11-16 22:24
标题: 来人了看看怎么搞
本帖最后由 走遍世界找寻你 于 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该怎么改才对?


作者: 中关村阿旺    时间: 2013-11-16 22:39
你说的是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);
之所以这样修改是因为内部类访问外部类的成员变量的格式就是这样,具体请参见毕老师的内部类视频。
作者: 走遍世界找寻你    时间: 2013-11-17 20:41
是的谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2