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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夏晓彤 中级黑马   /  2013-3-22 23:39  /  2025 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 夏晓彤 于 2013-3-24 20:50 编辑

问题:当创建 Road对象时,构造函数中还有线程还没执行完呢,12个对象就创立了,根本没走线程代码,然后执行        new LampController();然后才执行Road类中的线程,总之线程在构造函数中就看不懂了,不知道怎么执行顺序了,我认为new Road(directions[0]);要把构造函数里的所有代码执行完才可以new Road(directions[1]),Road类的构造方法中的两个线程不懂怎么执行的
package com.isoftstone.interview.traffic;
public class MainClass {
        /**
         * @param args
         */
        public static void main(String[] args) {        
                /*产生12个方向的路线*/               
                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 LampController();
        }
}





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);

        }
}

点评

如果问题未解决,请继续追问回复者,如果问题已经解决,请将分类改为“已解决”,谢谢  发表于 2013-3-24 08:25

评分

参与人数 1技术分 +2 收起 理由
黄玉昆 + 2 赞一个!

查看全部评分

7 个回复

倒序浏览
本帖最后由 谢洋 于 2013-3-22 23:49 编辑

项目要求:每个路口1到10之间会随机出现一辆车,也就是说,某条路上的车可能会在1-10秒不等的时间内增加一辆车。
for(int i=1;i<1000;i++){
                                        try {
                                                Thread.sleep((new Random().nextInt(10) + 1) * 1000);//线程一定会在1到十秒内执行到下面一行语句(往路上添加一辆车)
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                        vechicles.add(Road.this.name + "_" + i);//往记录该路上车辆的车的数量的容器增一辆车
                                }                                
                        }
那使用构造函数穿件对象是不是要等待线程运行完才能创建成功?这一句打错字了吗?看不是很明
回复 使用道具 举报
谢洋 发表于 2013-3-22 23:47
项目要求:每个路口1到10之间会随机出现一辆车,也就是说,某条路上的车可能会在1-10秒不等的时间内增加一 ...

我的问题是这线程上面时候结束,肯定不是睡那么久
回复 使用道具 举报
谢洋 发表于 2013-3-22 23:47
项目要求:每个路口1到10之间会随机出现一辆车,也就是说,某条路上的车可能会在1-10秒不等的时间内增加一 ...

改了创建
回复 使用道具 举报
夏晓彤 发表于 2013-3-22 23:58
改了创建

看来我是答非所问了,这个真搞不明
回复 使用道具 举报
想不明
可这样子做一个试验:
1、让一个子类继成Road顺便把run里面的内容改为打印信息,且让也它睡一会,
2、在子类的构造中调用父类的构造,并在其后打印信息,看一下打印顺序是怎么的的
经测试,不用等线程执行完才对完成对象的创建

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
谢洋 发表于 2013-3-23 00:43
想不明
可这样子做一个试验:
1、让一个子类继成Road顺便把run里面的内容改为打印信息,且让也它睡一会,

我把问题修改明确了,帮我解解下惑吧哥们
回复 使用道具 举报
谢洋 高级黑马 2013-3-24 01:26:21
8#

回帖奖励 +20

本帖最后由 谢洋 于 2013-3-24 01:27 编辑

下面代代码是通过创建子类对象时,查看子类的构造是否等父类中线程执行才被执行的:
当子类构造调用父类构造后,父类中的线程对象一旦被建立就会被启动;这时虽然线程对象被执行,但子类对象还没有被完全建立
也就是说对象只有建立后才能被使用的(如线程对象);不知怎么才表达得清楚,你查看代码的运行结果应该会明白的

  1. <P>package test;</P>
  2. <P>import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.concurrent.ExecutorService;
  5. import java.util.concurrent.Executors;
  6. import java.util.concurrent.ScheduledExecutorService;
  7. import java.util.concurrent.TimeUnit;</P>
  8. <P>public class MutipThread {</P>
  9. <P> /**
  10.   * @param args
  11.   */
  12. public static void main(String[] args) {
  13.   new ZiRoad("zizi");</P>
  14. <P> }</P>
  15. <P>}
  16. class Road {
  17.     private List<String> vechicles = new ArrayList<String>();
  18.    
  19.     private String name =null;
  20.     public Road(String name){
  21.             this.name = name;
  22.             
  23.             //模拟车辆不断随机上路的过程               
  24.             ExecutorService pool = Executors.newSingleThreadExecutor();
  25.             pool.execute(new Runnable(){
  26.                     public void run(){
  27.                             for(int i=1;i<1000;i++){
  28.                              try {
  29.                               System.out.println("第------段来了");
  30.                               Thread.sleep(2000);
  31.                               System.out.println("第=====段来了");
  32.          Thread.sleep(2000);
  33.         } catch (InterruptedException e) {
  34.          // TODO Auto-generated catch block
  35.          e.printStackTrace();
  36.         }
  37.                             }                                
  38.                     }
  39.                     
  40.             });
  41.             
  42.             //每隔一秒检查对应的灯是否为绿,是则放行一辆车               
  43.             ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);
  44.             timer.scheduleAtFixedRate(
  45.                             new Runnable(){
  46.                                     public void run(){
  47.                                      while(true){
  48.                                       
  49.                                       System.out.println("第二段来了");
  50.                  try {
  51.             Thread.sleep(1000);
  52.            } catch (InterruptedException e) {
  53.             // TODO Auto-generated catch block
  54.             e.printStackTrace();
  55.            }</P>
  56. <P>                                     }                       
  57.                                     }
  58.                             },
  59.                             1,
  60.                             1,
  61.                             TimeUnit.SECONDS);
  62.             
  63.     }
  64. }</P>
  65. <P>class ZiRoad extends Road{</P>
  66. <P> public ZiRoad(String name) {
  67.   super(name);
  68.   System.out.println("子子子子构造");//看看是否等线程执行完才执行到这
  69. }
  70. }
  71. </P>
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马