一个简单的生产者和消费者客服实现

247 阅读2分钟

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

1.职能分类

生产者-客服登录到系统
消费者-客户消费客服

2.简单的流程

1.没有有效的客服的时候就等待客服连接进入
2.客服登录系统,可用客服+1
3.客户消费客服,可用客服-1 
    这里是随机查询一个可用的客服
    也可以写一些其他的策略比如获取可用的第一个
                         比如客服维护个服务统计按照最小服务量的
4.当沟通完成后,可用客服+1
5.客服退出以后,可用客服-1

3.实现

可用客服这里用信号量Semaphore来做判断
客户消费客服采用线程方式
客服的操作采用CopyOnWriteArrayList

3.1客服的简单实体定义

public class Customer {
	private String name;//名称
	private String code;//代号 唯一
}

3.2客服的管理实现

public class CustomerManagerList {
	//信号量统计可以使用的客服信息
	public static Semaphore workSemaphore=new Semaphore(0);	
        
	//客服接入列表用了线程安全的CopyOnWriteArrayList
	private static List<Customer> cusSet= new CopyOnWriteArrayList<Customer>();
	
        //工作的用了线程安全的CopyOnWriteArrayList
	private static List<Customer> cusWorkSet= new CopyOnWriteArrayList<Customer>();
	
	//客户添加进入
	public static void addCustomer(Customer c) {
		cusSet.add(c);
		System.out.println(c.toString()+"接入。。。");
		workSemaphore.release();
	}
	
	//工作中的客服
	public static void addWork(Customer c) throws InterruptedException {
		cusWorkSet.add(c);
	}
	
	//工作结束
	public static void removeWork(Customer c) {
		cusWorkSet.remove(c);
		workSemaphore.release();
	}
	
	//退出
	public static void removeCustomer(Customer c) throws InterruptedException {
		cusSet.remove(c);
		cusWorkSet.remove(c);
	    workSemaphore.tryAcquire();
	}
	
	//随机获取下一个可用的客服信息
	public static Customer getWorkRandom() throws InterruptedException {
		workSemaphore.acquire();
		List<Customer> cusNotWork=new CopyOnWriteArrayList<Customer>();
		cusNotWork.addAll(cusSet);
		cusNotWork.removeAll(cusWorkSet);
		if(0==cusNotWork.size()) {
			workSemaphore.release();//没有数据消耗的补上来
			return null;
		}else {
			Customer result=cusNotWork.get(new Random().nextInt(cusNotWork.size()));
			addWork(result);//添加到工作
			return result;
		}
	}
}

3.3客服的消费实现

//通过线程的方式去消费客服
public class CustomerRun implements Runnable{

	@Override
	public void run() {
		try {
		      System.out.println("等待中...");
		      System.out.println(CustomerManager.workSemaphore.availablePermits());
		      Customer c = CustomerManagerList.getWorkRandom();
			if (null == c) {
				return;
			}
			System.out.println(c.toString() + "沟通中...");
			Thread.sleep(5 * 1000);
			System.out.println(c.toString() + "沟通结束...");
			CustomerManagerList.removeWork(c);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

3.4 测试

public static void test2() {
         //客户消费客服
	for (int i = 0; i < 100; i++) {
		CustomerRun cr = new CustomerRun();
		Thread t = new Thread(cr);
		t.start();
	}
        //模拟添加客服
	for (int i = 0; i < 15; i++) {
		CustomerManagerList.addCustomer(new Customer("name" + i, "code" + i));
	}
        //模拟添加客服
	for (int i = 15; i < 20; i++) {
		CustomerManagerList.addCustomer(new Customer("name" + i, "code" + i));
	}
}

3.5效果

image.png