黑马程序员技术交流社区

标题: 交通灯问题 [打印本页]

作者: 山水游客    时间: 2012-7-19 16:43
标题: 交通灯问题
package com.isoftstone.interview.traffic;
import java.util.*;
public class Road {
        
        public static void main(String[] args){
                Road dx = new Road("东西");
                dx.addCar();
                dx.PrintCarsName();
        }
        
        
        
        
        private static int num=0;
        //名字
        private String name=null;
        //排队中的车辆
        private List<String> listCar = new ArrayList<String>();
        
        Road(String name){
                this.name=name;
        //        addCar();
        }
        
        public void PrintCarsName(){
                for(String carName:listCar){
                        System.out.println("嗷嗷");
                        System.out.println(carName);
                }
        }
        
        //添加一辆车,可以以num代表车牌号,可以监控哦,这里简化直接用路线名字+车辆个数
        //public void addCar(int num){
        //public void addCar(){
        
        //这里先在构造函数随机添加车辆,后面专门建立一个类  做车辆的添加工作
        public void addCar(){
                new Thread(new Runnable(){
                        @Override
                        public void run() {
                                // 一到十秒随机加入一辆车
                                
                                for(int i=1; i<10; i++){
                                        try {
                                                Thread.sleep((new Random().nextInt(10)+1)*1000);
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        listCar.add(Road.this.name+":"+i);
                                        System.out.println("添加一辆车");
                                }
                                
                        }
                        
                }).start();
        }
}
为何dx.PrintCarsName();不执行????

作者: 王宝康    时间: 2012-7-19 17:38
嗯,你的代码里不会执行,
  1. public static void main(String[] args){
  2.                 Road dx = new Road("东西");
  3.                 dx.addCar();
  4.                 dx.PrintCarsName();
  5.         }
复制代码
可以看下主函数中每条语句的执行顺序,你的addCar()方法中有一个线程它一直在运行,然后一直没有结束,你的addCar()方法没有执行完,那下面的PrintCarsName()方法怎么会执行呢,要想让它也打印的话,应该是开启一个线程,然后让线程轮流调用你的addCar()和PrintCarsName()方法。我在试着改你的程序,你也可以改下试试。
作者: 温少邦    时间: 2012-7-19 17:40
dx.PrintCarsName()当然执行了
dx.addCar()只是开启了一个线程,线程开启完了就回到main函数了
只是你调用dx.addCar()后要过1-10秒才会出现第一辆车
马上调用dx.PrintCarsName()当然什么都没有显示了
作者: 王宝康    时间: 2012-7-19 17:46
我说错了,是添加车辆的线程和主线程轮流争cpu资源,应该是可以打印的。
作者: 任文杰    时间: 2012-7-19 21:22
dx.PrintCarsName()肯定会执行,而且只执行一次,执行的过程太快,没有看到,你可以将输出的结果打印到电脑中的磁盘文件上,那样看得更清楚。另外,可能会出现死锁的现象,因为新启动的线程在对listCar增加数据的过程中,这时dx.PrintCarsName()开始执行,对列表进行遍历,可能会发生冲突。导致死锁。下面是我对这个程序修改之后代码,仅供参考。
  1. package com.a;
  2. import java.util.*;
  3. import java.util.concurrent.CopyOnWriteArrayList;
  4. public class Road {
  5.         
  6.         public static void main(String[] args){
  7.                 Road dx = new Road("东西");
  8.                 dx.addCar();
  9.                 while (true) {
  10.                                         dx.PrintCarsName();
  11.                                 }
  12.         }
  13.             
  14.         private static int num=0;
  15.         //名字
  16.         private String name=null;
  17.         //排队中的车辆
  18.         //private List<String> listCar = new ArrayList<String>();
  19.         private CopyOnWriteArrayList<String> listCar = new CopyOnWriteArrayList<String>();
  20.         Road(String name){
  21.                 this.name=name;
  22.         //        addCar();
  23.         }
  24.         
  25.         public void PrintCarsName(){
  26.                 /*for(String carName:listCar){
  27.                         System.out.println("嗷嗷");
  28.                         System.out.println(carName);
  29.                 }*/
  30.                
  31.                     while (listCar.size()>0) {
  32.                                         System.out.println(listCar.remove(0));
  33.                                 }
  34.         }
  35.         
  36.         //添加一辆车,可以以num代表车牌号,可以监控哦,这里简化直接用路线名字+车辆个数
  37.         //public void addCar(int num){
  38.         //public void addCar(){
  39.         
  40.         //这里先在构造函数随机添加车辆,后面专门建立一个类  做车辆的添加工作
  41.         public void addCar(){
  42.                 new Thread(new Runnable(){
  43.                         @Override
  44.                         public void run() {
  45.                                 // 一到十秒随机加入一辆车
  46.                                 
  47.                                 for(int i=1; i<10; i++){
  48.                                         try {
  49.                                                 Thread.sleep((new Random().nextInt(10)+1)*1000);
  50.                                         } catch (InterruptedException e) {
  51.                                                 // TODO Auto-generated catch block
  52.                                                 e.printStackTrace();
  53.                                         }
  54.                                         listCar.add(Road.this.name+":"+i);
  55.                                         System.out.println("添加一辆车");
  56.                                 }
  57.                                 
  58.                         }
  59.                         
  60.                 }).start();
  61.         }
  62. }
复制代码





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