这是我参与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));
}
}