面向对象思想:
谁拥有数据,谁就对外提供操作这些数据的方法。
人在黑板上画圆---圆、列车司机紧急刹车---列车,售货员统计收获小票的金额----小票,你把门关上----门。
线程池:
Executors类中的有产生线程池的方法,线程池原理就是:产生一组线程,要做的事情分配给线程池,然后找空闲的线程来执行。
例://产生一个单个线程做什么事
ExecutorService pool= Executors.newSingleThreadExecutor();
pool.execute(new Runnable() {
@Override
public void run() {
}
});
tip:内部类访问外部类成员变量:外部类类名.this.变量名
定时器:
ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);
timer.schedule(
new Runnable(){},
1,
TimeUnit.SECONDS
);
//过1秒做什么事情,然后每过2秒做再做
ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);
timer.schedule(
new Runnable(){},
1,
TimeUnit.SECONDS
);
交通灯面试题:
road:
* 每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
* 每条路线上随机增加新的车辆,增加到一个集合中保存。
* 每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
在road构造函数中除了给road命名外,还定义了一个线程,用sleep方法结合Random对象的方法来添加车辆。以及定义了一个定时器
用来每隔1秒钟检查车对应的灯是否为绿。如果是则判断前面是否有车,没有则remove。
灯:
用枚举。注意这里的灯与现实有差距,我们假象每一个路线都有一个灯,即有12个灯。
枚举中有一个判断是否亮的方法,以及变红,变绿的两个方法。为了方便,还要定义个变量表示对应的灯,下一个灯,自己灯的状态。通过构造函数传入。比如说s2n与n2s灯应该一样。
但是构造函数传对应的灯对象,会编译出问题,改成传递对应灯的字符串。
灯的控制器:
控制器有成员,当前的灯,而且控制器一建立,就有一个路变亮,类似road,在其构造函数中要有一个定时器,每过一定时间让当前灯变红。
银行调度
NumberManager类:
定义一个用于存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合。
定义一个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据,所以,要进行同步。
NumberMachine类:
定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快速和VIP客户的号码管理器,定义三个对应的方法来返回这三个NumberManager对象。
将NumberMachine类设计成单例。
CustomerType枚举类:
系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。
重写toString方法,返回类型的中文名称。这是在后面编码时重构出来的。