Skip to content
/ sdcp Public

一套用于控制简单联网设备的协议设计和实现

Notifications You must be signed in to change notification settings

rhqD/sdcp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

54 Commits
 
 
 
 
 
 

Repository files navigation

#sdcp 一套用于控制简单联网设备的协议设计和实现

##基本设计: 服务器的线程池模型大致为实现以下几点需求:

  • 1.在访问量低的情况下尽可能地让每一个用户独享一个线程
  • 2.在访问量较多的情况下,控制同时为用户提供服务的线程的数量,防止线程过多导致线程间切换的花费过多。
  • 3.对服务完的线程进行阻塞操作,防止继续占用资源,但同时避免频繁地进行线程的创建和释放,提高线程的重用率。
  • 4.防止过多线程在线程池中等待过长时间。

##centralSystem 部分代码

public class centralSystem {
    public static Queue<worker> restRoom = new LinkedList<worker>();
    public static Queue<worker> workShop = new LinkedList<worker>();
    public static Queue<Socket> waitingRoom = new LinkedList<Socket>();
    public static void serve(Socket client){
    	synchronized(restRoom){
    		if (restRoom.isEmpty()) {//没有空闲线程,进行后续处理
    			synchronized(workShop){
    				if (workShop.size() < config.maxWorkers ){//当前工作线程数量没有超过预设阀值,则分配新线程
    					workShop.add(new worker(new procImplemention(), client));//返回点
    				} else {//当前工作线程超过预设阀值
    					synchronized(waitingRoom){
    						if (waitingRoom.size() > config.maxPacksInWait){//当前等待客户数量超过预设阀值,拒绝服务
    							try {
									client.close();//返回点
								} catch (IOException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();//返回点
								}
    						} else {//当前等待客户数量小于预设阀值,进入等待线程
    							waitingRoom.add(client);//返回点
    						}
    					}
    				}
    			}
    		} else {//空闲线程池有可服务线程。直接进行服务
    			worker him = restRoom.poll();
    			workShop.add(him);   			
    			him.holder.notify();//返回点
    		}
    	}
    }
}

About

一套用于控制简单联网设备的协议设计和实现

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages