自定义线程池
/***********************自定义线程池*************************/ /** * 手写线程池 * * @param corePoolSize 核心池大小 int * @param maximumPoolSize 最大池大小 int * @param keepAliveTime 保活时间 long(任务完成后要销毁的延时) * @param unit 时间单位 决定参数3的单位,枚举类型的时间单位 * @param workQueue 工作队列 用于存储任务的工作队列(BlockingQueue接口类型) * @param threadFactory 线程工厂 用于创建线程 * <p> * 线程不是越多越好,google工程师推荐 线程个数=cpu核心数+1(例如四核的开5个线程最好) */ // 参数任务上限 LinkedBlockingQueue<Runnable> blockingQueue = new LinkedBlockingQueue<>(10000); ThreadFactory threadFactory = new ThreadFactory() { // int i = 0; 用并发安全的包装类 AtomicInteger atomicInteger = new AtomicInteger(1); @Override public Thread newThread(Runnable r) { //创建线程 吧任务传进来 Thread thread = new Thread(r); // 给线程起个名字 thread.setName("线程" + atomicInteger.getAndIncrement()); return thread; } }; private final ThreadPoolExecutor pool = new ThreadPoolExecutor(10, 20, 1, TimeUnit.SECONDS, blockingQueue, threadFactory);
调用:
pool.execute(new Runnable() { @Override public void run() { boolean b = redisUtil.setIfAbsent(info.getId().toString(), info.getId(), 300000); //加锁 if (!b) { return; } try { .... } catch(...){ } finally{ redisUtil.del(info.getId().toString()); //解锁 } }
redis加解锁
public void del(String... key) { if (key != null && key.length > 0) { if (key.length == 1) { redisTemplate.delete(key[0]); } else { redisTemplate.delete(CollectionUtils.arrayToList(key)); } } } /** * 当键值不存在时,放入 * * @param key 键 * @param value 值 * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 * @return true成功 false 失败 */ public boolean setIfAbsent(String key, Object value, long time) { try { if (time > 0) { return redisTemplate.opsForValue().setIfAbsent(key, value, time, TimeUnit.SECONDS); } else { return redisTemplate.opsForValue().setIfAbsent(key, value); } } catch (Exception e) { e.printStackTrace(); return false; } }