hutool中的threadutil_Hutool - 好用的Java工具类库

Hutool是一个Java工具包,它帮助我们简化每一行代码,避免重复造轮子。如果你有需要用到某些工具方法的时候,不妨在Hutool里面找找,可能就有。本文将对Hutool中的常用工具类和方法进行介绍。9 n, v+ c0 |" i$ l

一、简介. c; v) d: q8 C" {

0 j2 p" f, }, [9 Y3 F% S5 j一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时提供以下组件:U9 V9 v- w! `, O& Z# p9 U

8 w/ s0 U* R8 w

hutool-core 核心,包括Bean操作、日期、各种Util等% v" C9 m& l& u/ S, f* X5 h5 d

hutool-aop JDK动态代理封装,提供非IOC下的切面支持+ E. ~# W" h4 H: Z$ _

hutool-bloomFilter 布隆过滤,提供一些Hash算法的布隆过滤

3 E& Q- u3 Z6 V0 ^3 M

hutool-cache 缓存

! Q6 n* w1 f) e

hutool-cron 定时任务模块,提供类Crontab表达式的定时任务

! a, ~& q8 x8 H) @8 v7 r

hutool-crypto 加密解密模块

; u  O$ D+ w  X9 G% F' ^

hutool-db JDBC封装后的数据操作,基于ActiveRecord思想

' S9 \1 y- H' I# _

hutool-dfa 基于DFA模型的多关键字查找

: H" }" G- H" b- ?: ^; s

hutool-extra 扩展模块,对第三方封装(模板引擎、邮件等)+ B0 `- @7 j& _) {' {* _

hutool-http 基于HttpUrlConnection的Http客户端封装. t1 b+ u- _# ]& Z4 g- J

hutool-log 自动识别日志实现的日志门面1 W& u* j! d( f- `6 L- n

hutool-script 脚本执行封装,例如Javascript

" t: z1 `7 [2 @( \1 K

hutool-setting 功能更强大的Setting配置文件和Properties封装

2 f4 `; V: D4 D/ z' f3 ~( a

hutool-system 系统参数调用封装(JVM信息等)

9 N- T9 Y0 l  a4 V

hutool-json JSON实现

! K2 N) _' i+ v8 A

hutool-captcha 图片验证码实现( h5 f6 P1 m7 {, q9 H' u二、安装( r8 M7 D! Q" y4 L& I, K

2 t8 @! }3 t/ |. W4 K

maven项目在pom.xml添加以下依赖即可:

+ p7 X0 \+ s: Z2 r7 Q    cn.hutool    hutool-all    5.2.2三、常用工具类

4 Y; q  ~& V) J# p5 w# {0 h  d; s! [* r* j5 U* Q7 ~4 K

1. DateUtil

% F1 q* i& D% u% p9 M8 d8 G, p5 g

4 S% G) |; K' f) P& I$ |  y' T日期时间工具类,定义了一些常用的日期时间操作方法。( s1 d$ l) Q  M2 I9 Y3 n% y, B

Date、long、Calendar之间的相互转换9 `" V2 x+ A, @

3 t  L: X7 R% z% m2 H//当前时间Date date = DateUtil.date();//当前时间Date date2 = DateUtil.date(Calendar.getInstance());//当前时间Date date3 = DateUtil.date(System.currentTimeMillis());//当前时间字符串,格式:yyyy-MM-dd HH:mm:ssString now = DateUtil.now();//当前日期字符串,格式:yyyy-MM-ddString today= DateUtil.today();字符串转日期

9 e9 v* _3 a- G' _! K, `0 [! Z5 g) J( E8 i2 x

DateUtil.parse方法会自动识别一些常用格式,包括:

+ t. J2 X" k& G; X  [7 }% J6 I, K2 r7 E8 z

yyyy-MM-dd HH:mm:ss2 b4 Q! c2 z  W, x8 J

yyyy-MM-dd& X! @6 R6 B5 {3 N1 N9 [- o* v9 @4 q

HH:mm:ss

( v2 B- j7 F( f+ h

yyyy-MM-dd HH:mm/ `! Y5 l. H( N; m/ Q

yyyy-MM-dd HH:mm:ss.SSS

1 M7 Y, }/ l: v  Z! A7 S% ~String dateStr = "2020-03-01";Date date = DateUtil.parse(dateStr);我们也可以使用自定义日期格式转化:

" X* B' X7 a4 t' |String dateStr = "2020/03/02";Date date = DateUtil.parse(dateStr, "yyyy/MM/dd");格式化日期输出* |: M& T9 C0 M; c1 a) k/ Y

: x  y* E. z7 j3 `

//结果 2020/03/01String format = DateUtil.format(date, "yyyy/MM/dd");//常用格式的格式化String formatDate = DateUtil.formatDate(date);String formatDateTime = DateUtil.formatDateTime(date);String formatTime = DateUtil.formatTime(date);获取Date对象的某个部分

6 f- i2 w3 X0 y! O+ o# L2 _' ~/ M# J6 z! S4 \

//获得年的部分int year = DateUtil.year(date);//获得月份,从0开始计数int month = DateUtil.month(date);//获得月份,从0开始计数Month monthEnum = DateUtil.monthEnum(date);//获得日int dayOfMonth = DateUtil.dayOfMonth(date);//获得星期数,从周日算起int dayOfWeek = DateUtil.dayOfWeek(date);//获得星期枚举Week dayOfWeekEnum = DateUtil.dayOfWeekEnum(date);开始和结束时间) b* @/ q7 i& H) D% O

1 ~% p$ q* i3 P& ~5 B- ?5 S) {

有的时候我们需要获得每天的开始时间、结束时间,每月的开始和结束时间等等,DateUtil也提供了相关方法:2 y& s' h% F2 N: B5 o6 b+ f, Z1 l

//一天的开始,结果:2020-03-01 00:00:00Date beginOfDay = DateUtil.beginOfDay(date);//一天的结束,结果:2020-03-01 23:59:59Date endOfDay = DateUtil.endOfDay(date);日期时间偏移

- k' P" E: C7 L6 y2 c' A% P

' v  M' L4 _& V$ |& A日期或时间的偏移指针对某个日期增加或减少分、小时、天等等,达到日期变更的目的。Hutool也针对其做了大量封装

0 P( s# g  p  i' w5 y& v% o# s9 [$ [Date newDate = DateUtil.offset(date, DateField.DAY_OF_MONTH, 2);DateTime newDate2 = DateUtil.offsetDay(date, 3);DateTime newDate3 = DateUtil.offsetHour(date, -3);针对当前时间,提供了简化的偏移方法(例如昨天、上周、上个月等):% e4 f+ i% B. ?' \# n3 s

//昨天DateUtil.yesterday()//明天DateUtil.tomorrow()//上周DateUtil.lastWeek()//下周DateUtil.nextWeek()//上个月DateUtil.lastMonth()//下个月DateUtil.nextMonth()日期时间差, p: {% e3 P4 C: B2 E

& S& C' K* j- C3 X; U7 V( ?有时候我们需要计算两个日期之间的时间差(相差天数、相差小时数等等),Hutool将此类方法封装为between方法:

+ B1 j+ S6 n; a3 B+ {% }long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY);计时器: k$ s# A9 _5 v$ u) Y: S. [

- Z8 d# X: K- h/ U: b* O0 `' I计时器用于计算某段代码或过程花费的时间- c2 c$ D& z* n! g

TimeInterval timer = DateUtil.timer();//---------------------------------//-------这是执行过程//---------------------------------timer.interval();//花费毫秒数timer.intervalRestart();//返回花费时间,并重置开始时间timer.intervalMinute();//花费分钟数其它! U- `: q+ Y4 G* l' p) y

) M( f6 R& k5 a1 x1 I' ?//年龄DateUtil.ageOfNow("1993-03-01");//是否闰年DateUtil.isLeapYear(2017);2. Convert

; D( X. ]% m) |: D- l* ?! T# N; W' I6 A: M$ }  a5 A

类型转换工具类,用于各种类型数据的转换。里面封装了针对Java常见类型的转换,用于简化类型转换。Convert类中大部分方法为toXXX,参数为Object,可以实现将任意可能的类型转换为指定类型。同时支持第二个参数defaultValue用于在转换失败时返回一个默认值。

% Y6 d0 O4 A8 S* u( `7 F/ A6 {Java常见类型转换

, F- l5 F1 u. ]9 P5 ^! w  q: K5 i5 p# B: s& _

8 N+ b0 m7 d$ P! n& y- |

转换为字符串:

# @' {- ^* T: e* M3 @9 K5 N- B- hint a = 1;//aStr为"1"String aStr = Convert.toStr(a);long[] b = {1,2,3,4,5};//bStr为:"[1, 2, 3, 4, 5]"String bStr = Convert.toStr(b);" b. {8 w8 O8 o8 M5 w8 p; W2 M

转换为指定类型数组:

8 i  o" J. {1 }String[] b = { "1", "2", "3", "4" };//结果为Integer数组Integer[] intArray = Convert.toIntArray(b);long[] c = {1,2,3,4,5};//结果为Integer数组Integer[] intArray2 = Convert.toIntArray(c);1 y8 Z: E- a- \0 `/ C3 h

转换为日期对象:. J0 O# u# @/ \" Z3 o" wString a = "2020-03-01";Date value = Convert.toDate(a);- p) |" Z8 A  H2 @9 h$ }/ V

转换为集合

5 V' U7 ?6 }0 ~; ^Object[] a = {"a", "你", "好", "", 1};List list = Convert.convert(List.class, a);//从4.1.11开始可以这么用List list = Convert.toList(a);其它类型转换* Y/ u: e' \' _- ^; Q" @% i! g

; g; ?; G, T+ o( Q' U$ A# {. h6 d8 d' ?

标准类型! c  Z/ E4 B; w6 q通过Convert.convert(Class, Object)方法可以将任意类型转换为指定类型,Hutool中预定义了许多类型转换,例如转换为URI、URL、Calendar等等。

0 |( G) G  ^2 y3 e2 X, ~& u; {; N  O* |1 ?4 [5 Q1 H

泛型类型0 a3 a, m+ q0 g  |8 u8 S5 N: {通过convert(TypeReference reference, Object value)方法,自行new一个TypeReference对象可以对嵌套泛型进行类型转换。例如,我们想转换一个对象为List类型,此时传入的标准Class就无法满足要求,此时我们可以这样:

% i" l2 x2 |4 D3 I' J; `/ \Object[] a = { "a", "你", "好", "", 1 };List list = Convert.convert(new TypeReference() {}, a);通过TypeReference实例化后制定泛型类型,即可转换对象为我们想要的目标类型。9 o) ], ~; v! f3 K% u- Y

半角和全角转换

! l* ^, p, L  n. d$ s# V2 Q5 d6 o+ e5 d

在很多文本的统一化中这两个方法非常有用,主要对标点符号的全角半角转换。

/ @! p+ H. b3 z: P9 v1 K半角转全角:$ a1 {1 c" [: A- {6 A1 z7 b" a

String a = "123456789,$()?!:;";//结果为:"123456789,$()?!:;"String sbc = Convert.toSBC(a);全角转半角:

+ j5 j6 @1 t5 x/ {String a = "123456789,$()?!:;";//结果为"123456789,$()?!:;"String dbc = Convert.toDBC(a);16进制(Hex); c/ G- [9 O& C+ x  \" e" q. h5 [

3 f# f! W, u2 W

在很多加密解密,以及中文字符串传输(比如表单提交)的时候,会用到16进制转换,就是Hex转换,为此Hutool中专门封装了HexUtil工具类,考虑到16进制转换也是转换的一部分,因此将其方法也放在Convert类中,便于理解和查找,使用同样非常简单:

: q8 P; s9 |$ Y6 {转为16进制(Hex)字符串8 Z6 n3 i- K9 P9 F* h, d. w

String a = "字符串";String hex = Convert.toHex(a, CharsetUtil.CHARSET_UTF_8);将16进制(Hex)字符串转为普通字符串:

, s4 E0 z: k% v$ i- gString hex = "e5ad97e7aca6e4b8b2";String raw = Convert.hexToStr(hex, CharsetUtil.CHARSET_UTF_8);因为字符串牵涉到编码问题,因此必须传入编码对象,此处使用UTF-8编码。 toHex方法同样支持传入byte[],同样也可以使用hexToBytes方法将16进制转为byte[]

J7 y* j1 B6 W& X( m* o; [1 VUnicode和字符串转换

- {8 l5 Q$ L& m& t/ w" L

/ r! A  K4 ~7 p3 b# G+ Q6 Q与16进制类似,Convert类同样可以在字符串和Unicode之间轻松转换:+ p2 t' g: y) P5 M, y  P

String unicode = Convert.strToUnicode(a);String raw = Convert.unicodeToStr(unicode);编码转换0 \8 _- v* g4 [

7 e( N9 L5 U7 ], z2 Y! @2 M

在接收表单的时候,我们常常被中文乱码所困扰,其实大多数原因是使用了不正确的编码方式解码了数据。于是Convert.convertCharset方法便派上用场了,它可以把乱码转为正确的编码方式:V. R: E' e7 W: T

String a = "我不是乱码";//转换后result为乱码String result = Convert.convertCharset(a, CharsetUtil.UTF_8, CharsetUtil.ISO_8859_1);String raw = Convert.convertCharset(result, CharsetUtil.ISO_8859_1, "UTF-8");Assert.assertEquals(raw, a);时间单位转换

+ ?- [3 i$ b# F$ F. T

2 \) z% q) w$ Y/ I0 nConvert.convertTime方法主要用于转换时长单位,比如一个很大的毫秒,我想获得这个毫秒数对应多少分:3 _3 P4 Q/ o. @

long a = 4535345;//结果为:75long minutes = Convert.convertTime(a, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);金额大小写转换

+ J8 s. g& s8 J# F, o& k# O6 P  j* `; L+ F3 K' Z

面对财务类需求,Convert.digitToChinese将金钱数转换为大写形式:

6 [( K6 t) G) m3 |, g, l9 D! ]* bdouble money = 1234.56;//结果为:"壹仟贰佰叁拾肆元伍角陆分"String digitUppercase = Convert.digitToChinese(a);注意 转换为大写只能精确到分(小数点儿后两位),之后的数字会被忽略。% ]+ }& A* z7 M/ F* }原始类和包装类转换

, l1 C1 |* T0 M# s, ^6 F5 o4 v. E, g9 w8 }2 X, a* K" M

有的时候,我们需要将包装类和原始类相互转换(比如Integer.classs 和 int.class),这时候我们可以:

/ K$ d, W) U- t//去包装Class wrapClass = Integer.class;//结果为:int.classClass unWraped = Convert.unWrap(wrapClass);//包装Class primitiveClass = long.class;//结果为:Long.classClass wraped = Convert.wrap(primitiveClass);3. StrUtil+ _5 F+ R' @2 v7 c

; A. U! f4 P( A# Y' M1 ~

字符串工具类,定义了一些常用的字符串操作方法。/ H& ?$ L' K( A; z* Z2 L8 p

hasBlank、hasEmpty方法% M) S  u1 M' N% h0 i

8 Q1 B* I8 S7 M6 P# E" ?

就是给定一些字符串,如果一旦有空的就返回true,常用于判断好多字段是否有空的(例如web表单数据)。7 K& D" s* c+ ~# K

这两个方法的区别是hasEmpty只判断是否为null或者空字符串(""),hasBlank则会把不可见字符也算做空,isEmpty和isBlank同理。

2 y+ {: e% M+ \removePrefix、removeSuffix方法/ l# p+ v% P% t7 o( K

8 W8 l' R$ ~0 ~- [* L3 E1 P这两个是去掉字符串的前缀后缀的,例如去个文件名的扩展名啥。

; g, q& F3 E/ v) b0 l0 `: hString fileName = StrUtil.removeSuffix("pretty_girl.jpg", ".jpg")  //fileName -> pretty_girl还有忽略大小写的removePrefixIgnoreCase和removeSuffixIgnoreCase都比较实用。- ?. h  w; D' h6 ?- c3 q* g; N2 c

sub方法1 K8 e3 n4 V: y2 C+ f9 j2 }

/ s0 X% j4 C. [- T5 ?subString方法越界会报异常,得自己判断,sub把各种情况判断都加进来了,而且index的位置还支持负数,-1表示最后一个字符,如果不小心把第一个位置和第二个位置搞反了,也会自动修正

/ A4 u# N& A3 }( j7 i4 iString str = "abcdefgh";String strSub1 = StrUtil.sub(str, 2, 3);String strSub2 = StrUtil.sub(str, 2, -3); String strSub3 = StrUtil.sub(str, 3, 2); format方法

" @0 t5 h# w/ o1 V7 D* [! x; _% W8 T( w, p

String template = "{}和{}";String str = StrUtil.format(template, "我", "你");参数是Object类型,传别的类型会自动调用toString()方法。

7 k/ ~8 J. }1 D* n4. NumberUtil

! Q  M: Q4 [/ v. P% q/ l2 I+ l  ^  k0 _/ H) T

数字处理工具类,可用于各种类型数字的加减乘除操作及判断类型。

* M% o( C1 F5 h+ Wdouble n1 = 1.234;double n2 = 1.234;double result;//对float、double、BigDecimal做加减乘除操作result = NumberUtil.add(n1, n2);result = NumberUtil.sub(n1, n2);result = NumberUtil.mul(n1, n2);result = NumberUtil.div(n1, n2);//保留两位小数BigDecimal roundNum = NumberUtil.round(n1, 2);String n3 = "1.234";//判断是否为数字、整数、浮点数NumberUtil.isNumber(n3);NumberUtil.isInteger(n3);NumberUtil.isDouble(n3);5. BeanUtil

, W2 J3 E8 K$ c/ k% X1 b' g  q1 Z% `3 e: H' x

JavaBean的工具类,可用于Map与JavaBean对象的互相转换以及对象属性的拷贝。

7 D) n4 k% E6 X1 ^8 v& {/ J1 nMap转Bean; q% b7 l4 O8 H/ H) T

& p, A7 A. I1 a% t, K% `7 ^: V提供了Map对象键值对注入Bean,其方法有:: E# i. S7 O( [8 u" z5 m

" f; H) D) z% C

BeanUtil.fillBeanWithMap 使用Map填充bean4 J/ q! N$ R3 eHashMap map = CollUtil.newHashMap();map.put("name", "Joe");map.put("age", 12);map.put("openId", "DFDFSDFWERWER");Person person = BeanUtil.fillBeanWithMap(map, new Person(), false);" w8 M! M7 H) u1 }+ D: l

BeanUtil.fillBeanWithMapIgnoreCase 使用Map填充bean,忽略大小写

; p% E' o8 O" r, G1 H; c  yHashMap map = CollUtil.newHashMap();map.put("Name", "yxm");map.put("aGe", 12);map.put("openId", "DFDFSDFWERWER");Person person = BeanUtil.fillBeanWithMapIgnoreCase(map, new Person(), false);同时提供了map转bean的方法,与fillBean不同的是,此处并不是传Bean对象,而是Bean类,Hutool会自动调用默认构造方法创建对象。当然,前提是Bean类有默认构造方法(空构造),这些方法有:6 ?* C3 q( H2 k5 c+ r: o

& H0 V7 }9 y3 X9 q

mapToBean,mapToBeanIgnoreCase0 o, |( h: E; i2 @4 u// 设置别名,用于对应bean的字段名HashMap mapping = CollUtil.newHashMap();mapping.put("a_name", "name");mapping.put("b_age", "age");Person person = BeanUtil.mapToBean(map, Person.class, CopyOptions.create().setFieldMapping(mapping));Bean转为Map

+ A. H5 }7 G  e( _, x+ g# X3 T1 [  O0 `8 ~, D; d) ~$ B

BeanUtil.beanToMap方法则是将一个Bean对象转为Map对象。' F1 f9 N( o$ B8 e% l, [# W0 o% a; M3 ]

Person person = new Person();person.setAge(14);person.setOpenid("11213232");person.setName("测试A11");person.setSubName("sub名字");Map map = BeanUtil.beanToMap(person);Bean转Bean( c# E( a6 U1 B. h- P/ X

8 M! h9 e4 R( `- E4 GBean之间的转换主要是相同属性的复制,因此方法名为copyProperties,此方法支持Bean和Map之间的字段复制。: }5 j" o0 T3 W* l7 o' f

BeanUtil.copyProperties方法同样提供一个CopyOptions参数用于自定义属性复制。

; q" |# i4 }$ q4 c( u" OPerson p1 = new Person();p1.setSlow(true);p1.setName("测试");p1.setSubName("sub测试");Map map = MapUtil.newHashMap();BeanUtil.copyProperties(p1, map);PmsBrand brand = new PmsBrand();brand.setId(1L);brand.setName("小米");brand.setShowStatus(0);//Bean转MapMap map = BeanUtil.beanToMap(brand);//Map转BeanPmsBrand mapBrand = BeanUtil.mapToBean(map, PmsBrand.class, false);//Bean属性拷贝PmsBrand copyBrand = new PmsBrand();BeanUtil.copyProperties(brand, copyBrand);6. ReflectUtil

3 e, t. Z7 B1 x6 I0 T0 b& P* O! [& y* z" C: ~0 J1 v2 O/ b

Java反射工具类,可用于反射获取类的方法及创建对象。* S2 ^: D( s" t* g" Z6 h( j4 c; S

//获取某个类的所有方法Method[] methods = ReflectUtil.getMethods(PmsBrand.class);//获取某个类的指定方法Method method = ReflectUtil.getMethod(PmsBrand.class, "getId");//使用反射来创建对象PmsBrand pmsBrand = ReflectUtil.newInstance(PmsBrand.class);//反射执行对象的方法ReflectUtil.invoke(pmsBrand, "setId", 1);7. CollUtil6 \/ `: u7 ]8 ?, j( p: ^

, G# B2 }+ I" t& x% b6 m; m( M" K0 ~5 `集合操作的工具类,定义了一些常用的集合操作。

; D/ a& `- O; s- h( E//数组转换为列表String[] array = new String[]{"a", "b", "c", "d", "e"};List list = CollUtil.newArrayList(array);//join:数组转字符串时添加连接符号String joinStr = CollUtil.join(list, ",");//将以连接符号分隔的字符串再转换为列表List splitList = StrUtil.split(joinStr, ',');//创建新的Map、Set、ListHashMap newMap = CollUtil.newHashMap();HashSet newHashSet = CollUtil.newHashSet();ArrayList newList = CollUtil.newArrayList();//判断列表是否为空CollUtil.isEmpty(list);8. MapUtil. H0 E+ ^0 u0 y3 M7 e: S

% b" E$ x5 v' i2 j

Map操作工具类,可用于创建Map对象及判断Map是否为空。& G" \& g/ e* s/ e6 z& _

//将多个键值对加入到Map中Map map = MapUtil.of(new String[][]{    {"key1", "value1"},    {"key2", "value2"},    {"key3", "value3"}});//判断Map是否为空MapUtil.isEmpty(map);MapUtil.isNotEmpty(map);9. AnnotationUtil

% C6 y; r3 ~. j8 g1 {. }# Z

' j, a$ x; V8 |/ j/ H; a注解工具类,可用于获取注解与注解中指定的值。4 g! E  |4 K3 H: h" }, d# O

//获取指定类、方法、字段、构造器上的注解列表Annotation[] annotationList = AnnotationUtil.getAnnotations(HutoolController.class, false);//获取指定类型注解Api api = AnnotationUtil.getAnnotation(HutoolController.class, Api.class);//获取指定类型注解的值Object annotationValue = AnnotationUtil.getAnnotationValue(HutoolController.class, RequestMapping.class);10. SecureUtil- g8 l1 |+ c. |# }2 `

8 ]8 A1 F) |3 h+ O2 u& B加密解密工具类,可用于MD5加密。

6 _, b" u/ l% Y- j4 E" ?//MD5加密String str = "123456";String md5Str = SecureUtil.md5(str);LOGGER.info("secureUtil md5:{}", md5Str);其他工具类# N2 o) p8 |) u

, ^; U: p- H) r8 |# q# E

Hutool中的工具类很多,可以参考:https://www.hutool.cn/

; g* c) d) E8 r& p9 A9 G' [四、项目源码地址

* }8 a" Y* ~( f) [# ?! B( T/ D& s" c& V

https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-hutool

1 e! \4 h" Y7 b4 d9 h8 F* ?  I" X; L4 z6 O. w

Java吧 收集整理 java论坛 www.java8.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThreadUtil.excAsync()方法是Hutool工具类的一个线程池工具方法,可以用于执行一个异步任务。它的用法如下: ```java ThreadUtil.excAsync(Runnable runnable) ``` 其,参数runnable是一个实现了Runnable接口的任务对象,表示需要异步执行的任务。 该方法会返回一个Future对象,可以通过该对象来获取异步任务的执行结果。如果异步任务执行过程抛出了异常,可以通过调用Future.get()方法获取到该异常。 下面是一个示例代码: ```java import cn.hutool.core.thread.ThreadUtil; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; public class Test { public static void main(String[] args) throws ExecutionException, InterruptedException { Future<?> future = ThreadUtil.excAsync(() -> { // 执行异步任务的代码 System.out.println("异步任务开始执行"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("异步任务执行完毕"); }); System.out.println("主线程继续执行"); // 获取异步任务的执行结果 future.get(); } } ``` 在上面的示例代码,我们通过ThreadUtil.excAsync()方法启动了一个异步任务,该任务是一个简单的线程休眠3秒钟后输出一条信息的任务。 在主线程调用future.get()方法会阻塞主线程,直到异步任务执行完毕。如果异步任务发生了异常,这里也会抛出ExecutionException异常,我们可以通过catch块来处理这种情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值