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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭宁 中级黑马   /  2012-5-28 20:26  /  1886 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.isoftstone.interview.traffic;

  2. import java.util.*;

  3. public class Road {
  4.        
  5.         public static void main(String[] args){
  6.                 Road dx = new Road("东西");
  7.                 dx.addCar();
  8.                 dx.PrintCarsName();
  9.         }
  10.        
  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.        
  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.        
  32.         //添加一辆车,可以以num代表车牌号,可以监控哦,这里简化直接用路线名字+车辆个数
  33.         //public void addCar(int num){
  34.         //public void addCar(){
  35.        
  36.         //这里先在构造函数随机添加车辆,后面专门建立一个类  做车辆的添加工作
  37.         public void addCar(){
  38.                 new Thread(new Runnable(){

  39.                         @Override
  40.                         public void run() {
  41.                                 // 一到十秒随机加入一辆车
  42.                                
  43.                                 for(int i=1; i<10; i++){
  44.                                         try {
  45.                                                 Thread.sleep((new Random().nextInt(10)+1)*1000);
  46.                                         } catch (InterruptedException e) {
  47.                                                 // TODO Auto-generated catch block
  48.                                                 e.printStackTrace();
  49.                                         }
  50.                                         listCar.add(Road.this.name+":"+i);
  51.                                         System.out.println("添加一辆车");
  52.                                 }
  53.                                
  54.                         }
  55.                        
  56.                 }).start();
  57.         }
  58. }
复制代码
为何dx.PrintCarsName();不执行????

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

3 个回复

正序浏览
main执行过PrintCarsName()了,只是listCar还没有内容,
可以在线程listCar.add(Road.this.name+":"+i);后再执行PrintCarsName()打印listCar的内容
public void addCar() {
                new Thread(new Runnable() {
                        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("添加一辆车");
                                        Road.this.PrintCarsName();
                                }
                        }
                }).start();
        }

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 李哲 于 2012-5-28 21:11 编辑

dx.addCar();
产生新的线程。即使它在主线程执行dx.PrintCarsName();之前就抢到执行权,也会sleep。所以还是主线程得到执行权,然后执行dx.PrintCarsName();
但是此时addCar()函数因为那个线程sleep,所以还没有往listCar加入任何元素。所以主线程很快执行dx.PrintCarsName();也没有打印出任何东西。(连“嗷嗷”都没有,因为listCar没有任何元素)。
要让dx.PrintCarsName();执行(其实你的代码不是没有执行,只是没有打印出东西),那就要addCar()函数往listCar加入元素后,再执行dx.PrintCarsName();

方法有很多。
比如你可以将addCar函数内sleep时间短一些。dx.addCar();之后,让主线程也sleep一会。
  1. public class Road {
  2.         
  3.         public static void main(String[] args) throws Exception{
  4.                 Road dx = new Road("东西");
  5.                 dx.addCar();
  6.               
  7.                 Thread.sleep(1000);//加入此语句,此处sleep时间只要比addCar()中平均sleep时间长一些即可。
  8.                 dx.PrintCarsName();
  9.                
  10.         }        
  11.         
  12.         
  13.         private static int num=0;
  14.         //名字
  15.         private String name=null;
  16.         //排队中的车辆
  17.         private List<String> listCar = new ArrayList<String>();
  18.         
  19.         Road(String name){
  20.                 this.name=name;
  21.         //        addCar();
  22.         }
  23.         
  24.         public void PrintCarsName(){
  25.                
  26.                 for(String carName:listCar){
  27.                        System.out.println("嗷嗷");
  28.                         System.out.println(carName);
  29.                 }
  30.               
  31.         }
  32.         
  33.         //添加一辆车,可以以num代表车牌号,可以监控哦,这里简化直接用路线名字+车辆个数
  34.         //public void addCar(int num){
  35.         //public void addCar(){
  36.         
  37.         //这里先在构造函数随机添加车辆,后面专门建立一个类  做车辆的添加工作
  38.         public void addCar(){
  39.                 new Thread(new Runnable(){

  40.                         @Override
  41.                         public void run() {
  42.                                 // 一到十秒随机加入一辆车
  43.                                 
  44.                                 for(int i=1; i<10; i++){
  45.                                         try {
  46.                                                 Thread.sleep((new Random().nextInt(10)+1)*10);//减少sleep时间。
  47.                                         } catch (InterruptedException e) {
  48.                                                 // TODO Auto-generated catch block
  49.                                                 e.printStackTrace();
  50.                                         }
  51.                                         listCar.add(Road.this.name+":"+i);
  52.                                         System.out.println("添加一辆车");
  53.                                 }
  54.                                 
  55.                         }
  56.                         
  57.                 }).start();
  58.         }
  59. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
dx.PrintCarsName();先执行了,然后dx.addCar();才依次执行添加的,程序需要修改。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马