Java 线程池的应用场景【1】
程序员文章站
2022-07-12 11:11:24
...
线程池的应用场景【1】
场景:数据更新
待更新的数据较多,分布在多个mysql数据表中
准备:构造线程池
public class ThreadPoolManager {
private final static int CORE_POOL_SIZE = 4;
final static RejectedExecutionHandler HANDLER = (r, executor) -> System.out.println("工作队列被拒绝");
public static final ThreadPoolExecutor THREAD_POOL
= new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS
, new ArrayBlockingQueue(WORK_QUEUE_SIZE), HANDLER);
}
返回对象:
public class KeyInfoVO {
public static final KeyInfoVO EMPTY = new KeyInfoVO ();
private Integer UserId = 0;
private Integer UserHomeId = 0;
private Integer UserOtherId = 0;
private Integer UserWorkId = 0;
}
入参:
public class CompleteKeyInfo implements Serializable {
public static final KeyInfo EMPTY = new KeyInfo();
private Integer type;
@ApiModelProperty("用户基本信息")
private UserInfo userInfo ;
@ApiModelProperty("用户家庭信息")
private UserHomeInfo userHomeInfo ;
@ApiModelProperty("用户其他信息")
private UserOtherInfo userOtherInfo ;
@ApiModelProperty("用户工作信息")
private UserWorkInfo userWorkInfo ;
}
具体使用场景:
利用多线程去更新数据
private static final Integer LATCH_COUNT = 4;
public KeyInfoVO modify(KeyInfo keyInfo) throws Exception {
KeyInfoVO vo = new KeyInfoVO();
final CountDownLatch latch = new CountDownLatch(LATCH_COUNT);
ThreadPoolManager.THREAD_POOL.execute(() -> {
Integer integer = userService.modify(keyInfo.getUserInfo());
System.out.printf("--------------------"+integer);
vo.setUserId(integer);
latch.countDown();
});
ThreadPoolManager.THREAD_POOL.execute(() -> {
Integer integer = UserHomeService.modify(keyInfo.getUserHomeInfo ());
vo.setUserHomeId (integer);
latch.countDown();
});
ThreadPoolManager.THREAD_POOL.execute(() -> {
Integer integer = UserOtherService.modify(keyInfo.getUserOtherInfo ());
vo.setUserOtherId (integer);
latch.countDown();
});
ThreadPoolManager.THREAD_POOL.execute(() -> {
Integer integer = UserWorkI.modify(keyInfo.getUserWorkInfo ());
vo.setUserWorkId (integer);
latch.countDown();
});
latch.await(20, TimeUnit.SECONDS);
return vo;
}