今天重新看了一次张孝祥老师的交通管理系统项目视频,发现里面有用到Executors,其实这个Executors就是一个线程池。
线程池的思想就相当于对象池一样,它也是开辟了一块内存空间,里面存放那些(未死亡的)线程,该池中的线程执行调度由池管理器来处理,当从池中取出一个、执行完之后又回归池中。这样的好处就可以避免反复的创建线程对象所带来的性能开销,从而节省了系统的资源。
项目中用到两处线程池的内容,
1,Executors.newSingleThreadExecutor() 单任务线程,结合项目中的意思就是一个”路线“实例对象创建后就执行这个线程,达到不断(下面是1000)往车集合(vechicles)里添加车辆。
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); //内部类访问外部类的变量,需要用类.this.变量<!--EndFragment-->
}
}
});
2,Executors.newScheduledThreadPool(1); 延迟连接池,可以说是一个定时器,就是规定它隔个多少时间就执行一次,该参数(1)是表示池中所保存的线程数为1,方法参数解释timer.scheduleAtFixedRate(线程、开始时间、定时间隔时间、时间类型),结合项目中的意思就是如果车集合不为空,则每过一秒钟就把该集合的第一个元素删除,也就是说逐步把该路线上的车一辆一辆减少。
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);
项目总结:其实该项目就是3块,一、是路线的类:首先随机不断的往路线车辆集合里添加车辆,然后每隔一秒判断是否为绿灯,是则把这个集合的第一个元素删除,不为绿灯就不变。二、灯的类,是一个枚举类,固定12个常量,也就是12个枚举类的实例对象,它们的有3个参数,(当前灯是否为绿、与当前灯同时为绿的对应方向、当前灯变红时下一个变绿的灯)。三、就是交通灯的管理,就是让一个方向的灯由绿变红,那它下一个方向的灯就变红,这样循环着。