在目前的应用开发中,有一个需要自动处理某状态订单的功能,需要和手动处理功能并行不能冲突和重复处理。目前大致写了一下demo实现,记录一下,方便以后有时间复习和改进。实现思路也比较简单,就是处理每笔订单的时候加个锁,无论是手动还是自动,都需要取得订单锁后才能处理,待处理订单队列方面,因为要考虑并发动态的添加或移除订单元素,暂时采用CopyOnWriteArrayList(ConcurrentHashMap也可以)来实现。加锁和解锁的过程都加了令牌,一来方便测试时验证加锁和解锁的是否为同一线程;二来也可以避免工程中误调解锁功能而导致程序出错。感觉对线程这块的知识掌握的还是不够深入,以后要多多加强。代码如下:
import java.util.List; import java.util.UUID; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CyclicBarrier; public class ThreadTest { //需要处理的订单数量, private static int MAX_ORDERS=10000; //最大线程数 private static int MAX_THREADS =100; //每个线程睡眠时间(订单处理时间) private static int SLEEP =10; //写复制list,支持并发修改和遍历功能,需要注意内存耗费的问题,可以采用ConcurrentHashMap等代替 private static List<Order> list=new CopyOnWriteArrayList<>();//new CopyOnWriteArrayList<>();//new ArrayList<>(); static { //初始化测试数据 for(int i=0;i<MAX_ORDERS