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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘旭 黑马帝   /  2012-4-4 13:54  /  2266 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看了张孝祥老师的交通灯项目后,我自己重写编写了一遍代码,但是,在运行时却发生了意想不到的问题。我的代码如下:

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

public class Road {
        String name = null;
        List<String> vehicles = new ArrayList<String>();

        Road(String name) {
                this.name = name;
                new Thread(new Runnable() {
                        @Override
                        public void run() {
                                for (int i = 1; i < 1000; i++) {
                                        // 内部类访问外部类的方法
                                        vehicles.add(Road.this.name + "_" + i);
                                        // 输出对应道路上车辆数及对应灯是否为緑色
                                        System.out.println("        " + Road.this.name + " "
                                                        + Lamp.valueOf(Road.this.name).isGreen + "  车辆 "
                                                        + vehicles.size());
                                        try {
                                                Thread.sleep((new Random().nextInt(10) + 1) * 1000);
                                        } catch (InterruptedException e) {
                                        }
                                }
                        }
                }).start();
                // Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(
                // new Runnable() {
                // @Override
                // public void run() {
                // Lamp lamp = Lamp.valueOf(Road.this.name);
                // if (lamp.isGreen) {
                // System.out.println(vehicles.remove(0)
                // + " is running....." + "rest:"
                // + vehicles.size());
                // }
                // }
                // }, 1, 1, TimeUnit.SECONDS);
                new Thread(new Runnable() {
                        @Override
                        public void run() {
                                for (int i = 0; i < 1000; i++) {
                                        try {
                                                Thread.sleep(1000);
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        Lamp lamp = Lamp.valueOf(Road.this.name);
                                        if (vehicles.size() > 0)
                                                if (lamp.isGreen) {
                                                        System.out.println(vehicles.remove(0)
                                                                        + " is running....." + "rest:"
                                                                        + vehicles.size());
                                                }
                                }

                        }
                }).start();
        }
}





public enum Lamp {
        W2E("E2W","W2N",false),W2N("E2S","S2N",false),S2N("N2S","S2W",false),S2W("N2E","W2E",false),
        E2W(null,null,false),E2S(null,null,false),N2S(null,null,false),N2E(null,null,false),       
        W2S(null,null,true),S2E(null,null,true),E2N(null,null,true),N2W(null,null,true);       

        String oppositeLamp;
        String nextLamp;
        boolean isGreen;
        private Lamp(String oppositeLamp, String nextLamp, boolean isGreen) {
                this.oppositeLamp = oppositeLamp;
                this.nextLamp = nextLamp;
                this.isGreen = isGreen;
        }
       
        public void turnGreen(){
                isGreen=true;
                System.out.println(name()+"変緑");               
                if(oppositeLamp!=null){
                        Lamp.valueOf(oppositeLamp).turnGreen();
                }               
        }
       
        public void turnRed(){
                isGreen=false;
                System.out.println("转换....");
                if(oppositeLamp!=null){
                        Lamp.valueOf(oppositeLamp).turnRed();
                }                       
        }
       
        public Lamp getNextLamp(){
                Lamp next=null;
                if(nextLamp!=null)
                        next=Lamp.valueOf(nextLamp);
                return next;
        }
        public boolean isGreen(){
                return isGreen;
        }
}




public class LampController {
            Lamp presentLamp;

                 LampController() {
                         presentLamp=Lamp.W2E;
                         new Thread(new Runnable() {                               
                                @Override
                                public void run() {
                                                while(true){
                                                        presentLamp.turnGreen();
                                                        try {
                                                                Thread.sleep(10000);
                                                        } catch (InterruptedException e) {
                                                                // TODO Auto-generated catch block
                                                                e.printStackTrace();
                                                        }
                                                        presentLamp.turnRed();
                                                        presentLamp=presentLamp.getNextLamp();
                                                }                                       
                                }
                        }).start();
                }          
}



public class MainClass {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                String [] directions = new String[]{
                                "S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"               
                };
                new LampController();
                for(int i=0;i<directions.length;i++){
                        new Road(directions);
                }               
        }
}
在以上代码中,此时运行是正常的。但是,当将Road类中判断车辆是否通过该路线的线程改为线程池创建的线程(即Road类中注释了得代码)时,运行却除了问题。具体表现为第二次変灯后路面向右转弯的车辆停止不前进了,但是,通过输出内容知道向右拐弯的车辆继续在增加,右拐灯也始终为緑。
再运行一段时间后,十字路口只有来的车辆,但是车辆却堵在了十字路口。

4 个回复

正序浏览
宋蕈 发表于 2012-4-6 08:36
public class MainClass {

        public static void main(String[] args) {

恩啦,是把路面先 new 出来
回复 使用道具 举报
public class MainClass {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                String [] directions = new String[]{
                                "S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"               
                };
                       for(int i=0;i<directions.length;i++){
                        new Road(directions);       //这里应该是把路面先 new 出来吧
                       }   
                      new LampController();
               
                           
        }
}
回复 使用道具 举报
郑苑东 发表于 2012-4-6 07:47
还没时间去仔细看你的代码。。不过最后一个错了MainClassfor(int i=0;i

  Lamp lamp = Lamp.valueOf(Road.this.name)!
没错吧!我虽然传的是字符串,但是在用的时候把它变成了相应的枚举对象了
回复 使用道具 举报
本帖最后由 郑苑东 于 2012-4-6 07:49 编辑

还没时间去仔细看你的代码。。不过最后一个错了MainClassfor(int i=0;i<directions.length;i++){
                        new Road(directions);  //传进去的是路线,是字符串。。你写的是字符串数组。真不知道你编译时怎么通过。。。。newRoad(directions);
                }      
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马