Java编程入门指南
发表时间: 2024-05-14 07:37
在日常开发过程中,为了提高程序的运行效率,往往会采用使用多线程。Java实现多线程主要有以下几种方式:
下面聊下在工作中使用线程池遇到的一个问题,项目中有一个线程工具类,大概如下:
public class ThreadUtil { /** * 核心线程数 */ private static final int corePoolSize = 5; /** * 最大线程数 */ private static final int maximumPoolSize = 10; /** * 线程存活时间 */ private static final int keepAliveTime = 2000; private static final ThreadPoolExecutor pool; static { pool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(200), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); } public static ThreadPoolExecutor getPool(){ return pool; }}
该类在初始化时会创建一下线程池,并提供静态方法返回线程池。本人知道有这么一个类存在,但是一直没有使用过。最近一个同事在使用这个类时遇到了一个问题,大概代码如下:
public void test02(){ CountDownLatch countDownLatch = new CountDownLatch(50); ThreadPoolExecutor pool = ThreadUtil.getPool(); for (int i = 0; i < 5; i++) { pool.submit(()->{ try { //模拟操作,等待5s Thread.sleep(5000L); } catch (InterruptedException e) { log.error("线程中断", e); } countDownLatch.countDown(); }); } try { boolean await = countDownLatch.await(30L, TimeUnit.SECONDS); if(!await){ log.error("任务执行超时"); } } catch (InterruptedException e) { log.error("线程中断", e); } }
该方法在执行时,有时成功,有时却提示“任务执行超时”。我看下了代码比较简单,没有明显的问题。思考了一会,线程里的方法并不复杂,不会执行耗时不会很长。那么问题应该出现在线程池本身上,这里线程池使用的公共方法获取的,那么应该是同时有其他任务用到了线程池,导致新的任务还没来的及超时。使用开发工具看了下,确实有好几处代码也使用了该线程池。为了验证问题,对代码临时修改下,使用
java.util.concurrent.Executors#newFixedThreadPool(int):
public void test02(){ CountDownLatch countDownLatch = new CountDownLatch(50); ExecutorService pool = Executors.newFixedThreadPool(5); for (int i = 0; i < 5; i++) { pool.submit(()->{ try { //模拟操作,等待5s Thread.sleep(5000L); } catch (InterruptedException e) { log.error("线程中断", e); } countDownLatch.countDown(); }); } pool.shutdown(); try { boolean await = countDownLatch.await(30L, TimeUnit.SECONDS); if(!await){ log.error("任务执行超时"); } } catch (InterruptedException e) { log.error("线程中断", e); }}
经过测试,问题不再复现,得到解决。在此大概总结下线程池知识进行简单总结。
Java线程池的流程主要涉及以下几个步骤,这些步骤帮助管理线程的创建、执行任务、复用和销毁,从而提高程序的效率和响应速度。以下是线程池工作的大致流程: