接口改造多线程
采用共享变量+Callable的方式需求:将同步代码改成多线程
原始同步代码如下:
1234567891011121314151617181920 JSONObject resultJson=new JSONObject();//查询该用户是否存在该任务 patrolDevice.setHead_people_id_number(userService.getUserDetailAndCheckIdNumber(token)); List<PatrolDevice> results=patrolDeviceDao.queryDeviceByObjectNoPagination(patrolDevice); if(results.isEmpty() || results.size()>1){ throw new MissingArgumentException("本设备不属于当前登录人员的巡检任务"); } PatrolDevice resultD ...
分布式锁
线程锁给方法、代码块加锁,某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如Synchronized、Lock等
进程锁控制同一个系统中多个线程访问同一个共享资源,因为程序的独立性,各个进程无法控制其他进程对资源的访问,可以利用操作系统的信号量机制
分布式锁多个进程不在同一个系统中,使用分布式锁控制多个进程对同一资源的访问
特性
互斥性:任意时刻,只能有一个客户端可以获取锁
安全性:: 锁只能被持有该锁的客户端删除,不能由其它客户端删除
死锁: 获取锁的客户端因为某些原因(如down机等)而未能释放锁,其它客户端再也无法获取到该锁。
容错:当部分节点(redis节点等)down机时,客户端仍然能够获取锁和释放锁
实现分布式锁的三种方式
基于缓存(Redis等)实现分布式锁;
基于数据库实现分布式锁;
基于Zookeeper实现分布式锁;
基于Redis的分布式锁利用SETNX和SETEX使用key-value的方式,以数据的某个属性作为键,给改代码块或者对象加锁。在进程初次 ...
多线程导出excel
线程池的5种状态状态分类RUNNING线程池处在 RUNNING 状态时,能够接收新任务,以及对已添加的任务进行处理。该状态是线程池的初始状态,线程池一旦被创建,就处于 RUNNING 状态
SHUTDOWN线程池处于 SHUTDOWN 状态时,不接收新任务,但能处理等待队列中的任务。线程池在 RUNNING 状态下,调用 shutdown() 方法,会变成 SHUTDOWN 状态。
STOP线程池处于 STOP 状态时,不接收新任务,不再处理等待队列中的任务,并且会中断正在处理的任务线程池在 RUNNING 状态下,调用 shutdownNow() 方法,变为 STOP 状态
TIDYING所有的任务都销毁了,工作线程数量为0,线程池的状态在转换为 TIDYING 状态时,会执行钩子方法 terminated()线程池在 SHUTDOWN 状态时,阻塞队列为空并且线程池中执行的任务也为空时,就会由 SHUTDOWN 状态变为 TIDYING 状态;线程池在 STOP 状态时,线程池中执行的任务为空时,就会由 STOP 状态变为 TIDYING 。
TERMINATEDterminat ...
