黑马程序员技术交流社区
标题:
交通灯 也让我晕菜了~~~泪奔
[打印本页]
作者:
郭宁
时间:
2012-5-28 20:26
标题:
交通灯 也让我晕菜了~~~泪奔
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-5-28 20:45
dx.PrintCarsName();先执行了,然后dx.addCar();才依次执行添加的,程序需要修改。
作者:
李哲
时间:
2012-5-28 21:08
本帖最后由 李哲 于 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一会。
public class Road {
public static void main(String[] args) throws Exception{
Road dx = new Road("东西");
dx.addCar();
Thread.sleep(1000);//加入此语句,此处sleep时间只要比addCar()中平均sleep时间长一些即可。
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)*10);//减少sleep时间。
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
listCar.add(Road.this.name+":"+i);
System.out.println("添加一辆车");
}
}
}).start();
}
}
复制代码
作者:
小小企鹅
时间:
2012-5-28 22:36
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();
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2