java 在线程执行器中执行任务并且返回结果

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

 

一、是什么

记得之前写过future获取异步线程执行结果:

http://www.xie4ever.com/2017/03/23/java-future%E8%8E%B7%E5%8F%96%E7%BA%BF%E7%A8%8B%E5%BC%82%E6%AD%A5%E6%89%A7%E8%A1%8C%E7%9A%84%E7%BB%93%E6%9E%9C/

上次是直接使用线程执行带返回结果的线程。这次我们尝试交给线程执行器执行。

二、为什么

原因同:

http://www.xie4ever.com/2017/03/28/java-threadpoolexecutor%E5%88%9B%E5%BB%BA%E7%BA%BF%E7%A8%8B%E6%89%A7%E8%A1%8C%E5%99%A8/

三、怎么做

1.简单例子

大致流程就是这样,代替了直接操作线程的方式。

这里创建了一个只有两条线程大小的线程池,但是现在存在三个任务,就如何执行?

我的理解:

线程池只能同时分配两条线程,所以先来先得,优先执行前两个任务。当某一个任务执行完毕,线程回到线程池中,就会被分配去执行第三个任务。

运行结果也证明了这一点:

2.复杂一点的例子

使用上次的情景:

老师让三个学生做一道题,每隔一段时间看看学生做完没有,如果学生没做完,就提醒一下做题方法,如果学生做完了,就拿给老师检查。

比较需要注意的是这里:

移除元素后需要i–,否则会报出java.util.ConcurrentModificationException异常。

运行结果:

四、总结

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