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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 新立 中级黑马   /  2012-12-18 10:34  /  1255 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Road {
        private List<String> vechicles = new ArrayList<String>();
       
        private String name =null;
        public Road(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) + 1) * 1000);
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                        vechicles.add(Road.this.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 traversing !");
                                                        }
                                                }
                                               
                                        }
                                },
                                1,
                                1,
                                TimeUnit.SECONDS);
               
        }
}

两个线程同时操作vechicles 变量,为什么没有用线程同步?难道和Executors有关系?求详解

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
同步的前提是 有两个 或者两个以上的线程,然后有共享数据。
而ExecutorService pool = Executors.newSingleThreadExecutor();  newSingleThreadExecutor() 创建一个执行者,使用单个工作线程操作一个无界的队列。
而ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);
                timer.scheduleAtFixedRate()  --创建并执行定期的行动,成为第一个在给定的初始启用的延迟,并随后用给定的时期; 就是 定时搞一下 某个动作,不是那个意义上的线程。
所以,现在并非两个线程。
回复 使用道具 举报
回复需要审核==== 凌乱了
回复 使用道具 举报
那个给 屏蔽了 ·· 主要就是说  这俩不是 俩线程 ,就一个线程,没有同步的问题。第二个只是 定时执行某个活动的 不是线程。线程同步的前提 两个及以上的线程数,且有共享数据。
回复 使用道具 举报
王玮 发表于 2012-12-18 12:06
那个给 屏蔽了 ·· 主要就是说  这俩不是 俩线程 ,就一个线程,没有同步的问题。第二个只是 定时执行某个 ...

不太理解,两个都用了Runnable,怎么是一个线程?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马