java 在线程执行器中执行任务并处理结果

是什么?为什么?怎么做?

 

一、是什么

java线程执行器可以执行一个任务列表,返回任务执行的结果,并且对结果进行处理。

二、为什么

之前我们给线程执行器执行的一直是单线程,而且都是能够成功执行的线程。

在现实开发中,经常会有这样的场景:

主线程等待很多子线程执行完毕,执行成功的子线程将返回结果,不成功的子线程将返回错误。这时主线程就要对返回结果进行相应的处理。

所以,我们需要线程执行器帮助实现这样的功能。

三、怎么做

1.运行多个任务并处理第一个结果

(1)两条线程都能成功执行,返回先执行完的线程的结果

需要注意的是executorService.invokeAny方法。线程执行器执行一个任务列表,如果任务列表中有一条线程执行成功,那么线程执行器将立即返回线程执行的结果。并且终止其他线程的执行。

在获取结果之前,当前线程会一直在invokeAny方法处被阻塞。

返回结果:

在这里,因为thread2只需要2秒就执行完成了,而此时thread1正处于睡眠状态,被提前终止了(没有输出 thread1 end),输出是thread2的结果。

(2)两条线程,一条成功执行,一条报错,将返回执行成功的结果

改造一下例子,让thread2线程主动报错:

如果报错的线程先执行完毕:

在这里,thread2先于thread1执行完毕。但是因为thread2报错,所以线程执行器等待thread1执行完毕后,才输出thread1的结果。

如果可成功执行的线程先执行完毕:

在这里,thread1先于thread2执行。因为thread1可以返回结果,所以线程执行器不需要再等待thread2执行,将其提前终止。

(3)两条线程都报错,invokeAny方法将抛出异常

改造一下例子,让两条线程都主动报错:

运行结果为invokeAny报错:

两条线程都报出错误,无返回值,导致invokeAny方法报错。

2.运行多个任务并处理所有结果

(1)两条线程都能成功执行,返回所有线程的结果

运行结果:

(2)两条线程,一条成功执行,一条报错,将输出各自的结果

运行结果:

(3)两条线程都报错,invokeAny方法将抛出两次异常

输出结果为:

四、总结

要体会线程执行器的思想。

发表评论

电子邮件地址不会被公开。 必填项已用*标注