黑马程序员技术交流社区
标题:
交通灯问题
[打印本页]
作者:
山水游客
时间:
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
嗯,你的代码里不会执行,
public static void main(String[] args){
Road dx = new Road("东西");
dx.addCar();
dx.PrintCarsName();
}
复制代码
可以看下主函数中每条语句的执行顺序,你的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()开始执行,对列表进行遍历,可能会发生冲突。导致死锁。下面是我对这个程序修改之后代码,仅供参考。
package com.a;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
public class Road {
public static void main(String[] args){
Road dx = new Road("东西");
dx.addCar();
while (true) {
dx.PrintCarsName();
}
}
private static int num=0;
//名字
private String name=null;
//排队中的车辆
//private List<String> listCar = new ArrayList<String>();
private CopyOnWriteArrayList<String> listCar = new CopyOnWriteArrayList<String>();
Road(String name){
this.name=name;
// addCar();
}
public void PrintCarsName(){
/*for(String carName:listCar){
System.out.println("嗷嗷");
System.out.println(carName);
}*/
while (listCar.size()>0) {
System.out.println(listCar.remove(0));
}
}
//添加一辆车,可以以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();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2