• 线程工具-ThreadUtil
    • 由来
    • 原理
    • 方法
      • ThreadUtil.execute
      • ThreadUtil.newExecutor
      • ThreadUtil.excAsync
      • ThreadUtil.newCompletionService
      • ThreadUtil.newCountDownLatch
      • ThreadUtil.sleep
      • ThreadUtil.getStackTrace
      • 其它

    线程工具-ThreadUtil

    由来

    并发在Java中算是一个比较难理解和容易出问题的部分,而并发的核心在线程。好在从JDK1.5开始Java提供了concurrent包可以很好的帮我们处理大部分并发、异步等问题。

    不过,ExecutorService和Executors等众多概念依旧让我们使用这个包变得比较麻烦,如何才能隐藏这些概念?又如何用一个方法解决问题?ThreadUtil便为此而生。

    原理

    Hutool使用GlobalThreadPool持有一个全局的线程池,默认所有异步方法在这个线程池中执行。

    方法

    ThreadUtil.execute

    直接在公共线程池中执行线程

    ThreadUtil.newExecutor

    获得一个新的线程池

    ThreadUtil.excAsync

    执行异步方法

    ThreadUtil.newCompletionService

    创建CompletionService,调用其submit方法可以异步执行多个任务,最后调用take方法按照完成的顺序获得其结果。若未完成,则会阻塞。

    ThreadUtil.newCountDownLatch

    新建一个CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

    ThreadUtil.sleep

    挂起当前线程,是Thread.sleep的封装,通过返回boolean值表示是否被打断,而不是抛出异常。

    ThreadUtil.safeSleep方法是一个保证挂起足够时间的方法,当给定一个挂起时间,使用此方法可以保证挂起的时间大于或等于给定时间,解决Thread.sleep挂起时间不足问题,此方法在Hutool-cron的定时器中使用保证定时任务执行的准确性。

    ThreadUtil.getStackTrace

    此部分包括两个方法:

    • getStackTrace 获得堆栈列表
    • getStackTraceElement 获得堆栈项

    其它

    • createThreadLocal 创建本地线程对象
    • interupt 结束线程,调用此方法后,线程将抛出InterruptedException异常
    • waitForDie 等待线程结束. 调用 Thread.join() 并忽略 InterruptedException
    • getThreads 获取JVM中与当前线程同组的所有线程
    • getMainThread 获取进程的主线程