黑马程序员技术交流社区
标题:
张老师的交通系统,关于线程安全问题的讨论?
[打印本页]
作者:
黑马晓志
时间:
2014-4-4 21:52
标题:
张老师的交通系统,关于线程安全问题的讨论?
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
* 每条路线上随机增加新的车辆,增加到一个集合中保存。
* 每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
* @author 张孝祥 www.it315.org
*
*/
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();
//每隔1秒让车通行,通行前要先判断灯是否亮,亮了才能通行,即从集合中移除
if(lighted){
System.out.println(vechicles.remove(0) + " is traversing !");
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}
复制代码
一个线程增加车辆,一个线程减少车辆,操作的是同一个集合,会不会存在线程安全问题。是不是应该使用Collections的 synchronizedList(List list)方法,让集合变成安全的?
作者:
osully
时间:
2014-4-4 21:55
函数上有synchronized
作者:
黑马晓志
时间:
2014-4-4 22:03
osully 发表于 2014-4-4 21:55
函数上有synchronized
只有一个构造函数,哪里有sychronized()
作者:
osully
时间:
2014-4-4 23:10
不好意思哦...忘了张老师的怎么写的了....因为我自己写的时候写的synchronized
我以为他也写了
可以参考下我写的..有什么好的建议告诉我哦
http://bbs.itheima.com/thread-111492-1-1.html
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2