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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 席杰 于 2014-8-6 20:29 编辑

import java.util.*;
import java.util.concurrent.*;
public class ShiYan {
        private static String name="右行";
        //定义车辆集合
        private static List<String> vehicles=new ArrayList<String>();
        //定义产生车辆的函数
        public static void createVehicle(){
                ExecutorService pool=Executors.newSingleThreadExecutor();
                pool.execute(new Runnable(){
                        public void run(){
                                for(int i=0;i<1000;i++){
                                        try {
                                                Thread.sleep((new Random().nextInt(10)+1)*1000);
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                        vehicles.add(name+i);
                                }
                        }
                });
        }
        //定义控制车辆的函数
        public static void controlVehicle(){
                ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
                timer.scheduleAtFixedRate(
                                new Runnable(){
                                        public void run(){
                                                //if(vehicles.size()>0){
                                                        if(true){
                                                                String vehiclesName=vehicles.remove(0);
                                                                System.out.println(vehiclesName+" 通过十字路口了!");
                                                        }
                                                //}
                                        }
                                },
                                1,
                                1,
                                TimeUnit.SECONDS
                );
        }
        public static void main(String[] args) {
                createVehicle();
                controlVehicle();
        }
}
这是学习交通灯管理系统遇到的问题,为什么去掉红色部分,就不会产生车辆通过的现象?
然而蓝色部分为true,条件一直满足应该这段程序一直都在运行,而产生车辆函数createVehicle(),一直在不定时的产生车辆,车辆集合vehicles应该是有车辆的,条件都满足,为什么System.out.println(vehiclesName+" 通过十字路口了!")而不能运行。
刚开始自己编完就出现了这个问题,想了半天也没查出原因,后来查看老师的程序才发现这好像出了问题,但是不能理解,求大神解释!谢谢了

4 个回复

倒序浏览
你不判断是否有车辆,怎么就知道车辆集合vehicles应该是有车辆的…
你也知道产生车辆函数createVehicle(),一直在不定时的产生车辆,就不能确定第一次 vehicles.remove(0) 的时候 0 的位置有对象,就算第一次有,第二次也不能确定,早晚会越界,我觉得是会报错的吧
回复 使用道具 举报
icris 发表于 2014-7-31 14:13
你不判断是否有车辆,怎么就知道车辆集合vehicles应该是有车辆的…
你也知道产生车辆函数createVehicle(), ...

越界,但我编程时好像没见报错啊,只是没有打印输出。你说的越界,是不是,假如,现在vehicles.size()为0,然后vehicles.remove(0)就会报空指针,溢出,对吧?
回复 使用道具 举报
席杰 发表于 2014-7-31 16:46
越界,但我编程时好像没见报错啊,只是没有打印输出。你说的越界,是不是,假如,现在vehicles.size()为0 ...

我试了试在remove前面加上一句 System.out.println(vehicles.size());
打印了一个 0 ,然后卡住了,完全没有循环,把产生车辆的方法去掉都没影响…这一个线程就停在这了。
异常肯定要抛出来的,猜测是被外层的什么地方 catch 到了,把线程处理掉了吧
回复 使用道具 举报
icris 发表于 2014-7-31 18:17
我试了试在remove前面加上一句 System.out.println(vehicles.size());
打印了一个 0 ,然后卡住了,完全 ...

我试试,谢谢了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马