java线程池使用实例
以下是Java线程池使用的一个示例,多个list一次更新改为线程池每次批量更新,代码如下:
import model.User; import org.springframework.util.CollectionUtils; import util.SplitListUtils; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * @author tian.jiyun * @date 2022/6/27 21:52 */ public class ThreadM<T> { public void threadMethod(List<T> res, int subLength) { List<T> updateList = new ArrayList<>(); ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(20, 50, 4, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10), new ThreadPoolExecutor.CallerRunsPolicy()); List<List<T>> splitList = SplitListUtils.splitList(res, subLength); //记录单个任务的执行次数 CountDownLatch countDownLatch = new CountDownLatch(splitList.size()); for (List<T> splist : splitList) { threadPoolExecutor.execute(new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < splist.size(); i++) { // 将每一个对象进行数据封装, 并添加到一个用于存储更新数据的list User user = (User) splist.get(i); if (user != null) { user.setAge(10 + i); user.setId(100 + i); user.setName("name" + i); user.setBirthDay(LocalDateTime.now()); } } } })); // 任务个数 - 1, 直至为0时唤醒await() countDownLatch.countDown(); } try { // 让当前线程处于阻塞状态,直到锁存器计数为零 countDownLatch.await(); } catch (InterruptedException e) { throw new NullPointerException(e.getMessage()); } // // 通过mybatis的批量插入的方式来进行数据的插入, 这一步还是要做判空 // if (!CollectionUtils.isEmpty(updateList)) { // System.out.println("批量更新"); // } } }
没有什么优雅的代码比空代码的执行效率更高