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效果
网络异常,图片无法展示
|