为了方便读者, 我这次的异常是把 executor.shutdownNow() 去掉后就解决了
详细的请往下看
当前环境:
windows
springboot
线程池
redis
当前业务逻辑: 测试并发时生成 id 的功能是否不重复
创建任务对象, 使用 redis 完成 value 的自增
然后使用线程池执行这个任务
报错信息:
org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 127.0.0.1:6379
测试步骤:
window 的 redis-cli 连接本地的 redis-serve 成功
window 的 redis-cli 连接 linux 的 redis-serve 成功
springboot 运行后发请求, redisTemplate.opsForValue().increment(key, value) 报错
由于使用了多线程:
不使用多线程时, redisTemplate.opsForValue().increment(key, value) 正常
使用多线程后: redisTemplate.opsForValue().increment(key, value) 失败
然后开始各种输出: 最后发现问题出在这里:
executor.execute(runnable);
while (flag) {
Thread.sleep(1000);
System.out.println("睡眠");
}
executor.shutdownNow();
解决方法:
springboot 使用线程池不要调用 executor.shutdownNow(); ??????
当前去掉这行代码后立刻就不报错了, 原因未知
温馨提示:
共享数据使用线程池进行操作, 需要确保每个线程执行的是同一个任务对象
如果是执行一个线程创建一个任务对象, 数据不会共享