由来
并发在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 获取进程的主线程