在实际开发过程中,在线程池使用过程中可能会遇到各方面的故障,如线程池阻塞,线程池满了的情况,遇到这些都会让系统无法正常工作,那java怎么查看线程池是否满?下面来我们就来给大家讲解一下。
如果你想监控某一个线程池的执行状态,线程池执行类 ThreadPoolExecutor 也给出了相关的 API, 能实时获取线程池的当前活动线程数、正在排队中的线程数、已经执行完成的线程数、总线程数等。
根据数据集合的大小,所开线程的数量,计算每个线程需要执行查询的数据量。
计算出SQL语句中每个查询的起始位置和结束位置下标。
每个线程,查询各自的范围内的数据。
public void queryByThread() { // 数据集合大小,由调用者自己指定 int listSize = 100; // 开启的线程数 int runSize = 20; // 一个线程处理数据条数,如果库中有100条数据,开启20个线程,那么每一个线程执行的条数就是5条 int count = listSize / runSize; //5 // 创建一个线程池,数量和开启线程的数量一样 ExecutorService executor = CreateThreadUtil.createThread(runSize); // 计算sql语句中每个分页查询的起始和结束数据下标 // 循环创建线程 //此处调用具体的查询方法 System.out.println("开始查询"); for (int i = 0; i < runSize; i++) { int index = i * count; int num = count; executor.execute(new Runnable() { @Override public void run() { try { //查询的结果如何保存下来,会不会存在覆盖的问题 System.out.println("每次查询的下标:" + index + ",条数:" + num); ListtextList = textMapper.queryByThread(index, num); //这里做处理信息的方法 } catch (Exception e) { System.out.println("查询失败" + e); } } }); } // 执行完关闭线程池 executor.shutdown(); }
创建线程池:
package com.klay.service.impl; import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class CreateThreadUtil { public static ThreadPoolExecutor createThread(int runSize) { ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() .setNameFormat("测试信息") .build(); //创建线程工厂 //创建线程池 ThreadPoolExecutor executor = new ThreadPoolExecutor(runSize , runSize , 0 L , TimeUnit.MILLISECONDS , new LinkedBlockingQueue < > (1024) , namedThreadFactory , new ThreadPoolExecutor.AbortPolicy()); return executor; } }
Java线程池如何创建?
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
1.newCachedThreadPool 这里的线程池是无限大的,当一个线程完成任务之后,这个线程可以接下来完成将要分配的任务,而不是创建一个新的线程。
public static void main(String[] args) { ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { final int index = i; try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } cachedThreadPool.execute(new Runnable() { public void run() { System.out.println(index); } }); } }
2.newFixedThreadPool
public static void main(String[] args) { ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); for (int i = 0; i < 10; i++) { final int index = i; fixedThreadPool.execute(new Runnable() { public void run() { try { System.out.println(index); Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } }); } }
3.newScheduledThreadPool
public static void main(String[] args) { ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); for (int i = 0; i < 10; i++) { scheduledThreadPool.schedule(new Runnable() { public void run() { System.out.println("delay 3 seconds"); } }, 3, TimeUnit.SECONDS); } }
4.newSingleThreadExecutor 按顺序来执行线程任务 但是不同于单线程,这个线程池只是只能存在一个线程,这个线程死后另外一个线程会补上。
public static void main(String[] args) { ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { final int index = i; singleThreadExecutor.execute(new Runnable() { public void run() { /* System.out.println(index);*/ try { System.out.println(index); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } }); } }
我们可以利用以上的方法进行java线程池的创建,在创建的过程中,我们需要进行线程池设置,设置不能过大也不能过小,不然就会影响运行!最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。
推荐阅读: