轮询客户端的实现
摘要: 服务器端给第一个客户端发送notification,然后在限定时间内,等待客户端作出回应—向服务器发送request。如果客户端一直没有回复,服务器会在到达限定时间后,向第二个客户端发送notification。如果客户端在限定时间内回复,服务器端放弃再给其他客户端发送消息。
Design
服务器、客户端使用socket发送和接收信息
发送端存在一个客户端列表,每次发送一给一个客户端,发送后,向Helper发送添加该客户端id的请求。
客户端收到信息会向Helper发送删除该id的请求。
Helper收到add时,启动一个ScheduledExecutorService类的schedule,延时启动一个线程,并将该schedule缓存。remove时,从缓存里取出schedule并停止它。如果在延时时间内,线程没有被停止,它会被执行:从缓存中取出,告诉服务器向下一个客户端发送请求。
阅读全文
Java线程池类ThreadPoolExecutor浅析
摘要: 线程池的特点是将任务的提交和执行分开。这样做的好处是,能使处理器尽量多地同时执行任务。
1.当工人数量没有达到最小雇佣数量时,每当任务来临,线程池都要创建一个工人,把工人加入工人集合。
2.如果任务来临时,当前工人数量poolSize已经大于最小雇佣数量,线程池尝试把任务加入任务列表,如果成功,任务提交的步骤就结束了。
2.5.工人会不断地尝试从队列里获取任务,如果获取到任务(请看5),工人就把任务拿去执行。这是任务的执行步骤。
3.如果加入队列失败,再雇佣一个工人或者
4.拒绝该任务。
5.工人等待任务的策略分两种(本文不考虑生命周期和状态):死等!在给定时间内等。
6.没有任务则把该工人的线程结束。
7.没有拿到任务的工人,被清除出工人集合。
阅读全文