黑马程序员技术交流社区
标题:
关于交通灯管理系统的线程同步疑惑
[打印本页]
作者:
新立
时间:
2012-12-18 10:34
标题:
关于交通灯管理系统的线程同步疑惑
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);
}
}
两个线程同时操作vechicles 变量,为什么没有用线程同步?难道和Executors有关系?求详解
作者:
王玮
时间:
2012-12-18 12:03
同步的前提是 有两个 或者两个以上的线程,然后有共享数据。
而ExecutorService pool = Executors.newSingleThreadExecutor(); newSingleThreadExecutor() 创建一个执行者,使用单个工作线程操作一个无界的队列。
而ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate() --创建并执行定期的行动,成为第一个在给定的初始启用的延迟,并随后用给定的时期; 就是 定时搞一下 某个动作,不是那个意义上的线程。
所以,现在并非两个线程。
作者:
王玮
时间:
2012-12-18 12:04
回复需要审核==== 凌乱了
作者:
王玮
时间:
2012-12-18 12:06
那个给 屏蔽了 ·· 主要就是说 这俩不是 俩线程 ,就一个线程,没有同步的问题。第二个只是 定时执行某个活动的 不是线程。线程同步的前提 两个及以上的线程数,且有共享数据。
作者:
新立
时间:
2012-12-19 14:40
王玮 发表于 2012-12-18 12:06
那个给 屏蔽了 ·· 主要就是说 这俩不是 俩线程 ,就一个线程,没有同步的问题。第二个只是 定时执行某个 ...
不太理解,两个都用了Runnable,怎么是一个线程?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2