如何使用CompletionService?
ComPletionservice有什么用?如果你的需求是按任务完成时间,先后顺序返回执行结果,那么推荐你使用它,例如这个动画演示了
线程池正在执行三个任务,
任务上的数字表示他们的执行时长,时长为一秒的任务最先完成,
其次是时长为两秒的任务,
最后是时长为三秒的任务,
他们完成以后,按照完成时间先后顺序返回结果,意思是123,如果你的需求也是这样的话,那么请你使用ComPletionservice, ComPletionservice是一个接口,
它的功能刚刚也了解过,就是返回结果采用的是执行优先原则,
先执行完先返回,它带有泛型可以指定任务结果的类型。
它里面一共有5个方法,
这5个方法的作用都列举在这,上面这2个submit方法用于提交任务。
下面这三个方法用于获取任务执行结果,
这是ComPletionservice接口唯一的实现类。
ExecutorComPletionservice它有两个构造方法,这两个构造方法都有一个参数Executor,
说明它依赖于线程池,除此以外它还可以指定装任务结果的队列,
接下来编写实例代码,首先定义一个任务task,实现callable接口并指定泛型为integer,重写call方法,定义一个int类型的属性timeout,用于记录执行时间,重载构造方法用于初始化执行时间,各方法返回执行时间,在返回之前输出当前执行时间,输出完以后使当前线程的休眠,用于模拟任务执行时长,
接下来执行该任务,首先创建一个固定大小为5的线程池,然后创建一ExecutorComPletionservice对象,并指定线程池,接收该对象,接着使用for循环,从5~1提交5个任务,创建任务并指定任务执行时长为I,接着提交任务不接收方法返回值。因为我们获取结果的地方不在这,在另一个for循环中,调用ComPletionservice的这个方法,拿到future对象,再调用future的get方法获取结果,并输出take方法和get方法有异常抛出 ,使用try---catch将其捕获,写上finally代码块,在 finally代码块中调用shoudown方法关闭线程,
至此main方法编写完成,整个例子,也编写完成。
执行程序,观察执行结果。
从执行结果来看,程序输出执行顺序54321,返回顺序12345,
说明 ComPletionservice的确是按照任务完成时间先后顺序返回结果,
总结
最后总结一下本节内容。本节介绍了 ComPletionservice它的作用及用法,这里就不再赘述了,在实际开发中只要是遇到执行多个任务,需要按照任务完成时间先后顺序返回结果的,就可以使用 ComPletionservice来解决这些的代码。
附录:
笔记完整文本:
ComPletionservice有什么用?如果你的需求是按任务完成时间,先后顺序返回执行结果,那么推荐你使用它,例如这个动画演示了线程池正在执行三个任务,任务上的数字表示他们的执行时长,时长为一秒的任务最先完成,其次是时长为两秒的任务,最后是时长为三秒的任务,他们完成以后,按照完成时间先后顺序返回结果,意思是123,如果你的需求也是这样的话,那么请你使用ComPletionservice, ComPletionservice是一个接口,它的功能刚刚也了解过,就是返回结果采用的是执行优先原则,先执行完先返回,它带有泛型可以指定任务结果的类型。它里面一共有5个方法,这5个方法的作用都列举在这,上面这2个submit方法用于提交任务。下面这三个方法用于获取任务执行结果,这是ComPletionservice接口唯一的实现类。 ExecutorComPletionservice它有两个构造方法,这两个构造方法都有一个参数Executor,说明它依赖于线程池,除此以外它还可以指定装任务结果的队列,接下来编写实例代码,首先定义一个任务task,实现callable接口并指定泛型为integer,重写call方法,定义一个int类型的属性timeout,用于记录执行时间,重载构造方法用于初始化执行时间,各方法返回执行时间,在返回之前输出当前执行时间,输出完以后使当前线程的休眠,用于模拟任务执行时长,接下来执行该任务,首先创建一个固定大小为5的线程池,然后创建一ExecutorComPletionservice对象,并指定线程池,接收该对象,接着使用for循环,从5~1提交5个任务,创建任务并指定任务执行时长为I,接着提交任务不接收方法返回值。因为我们获取结果的地方不在这,在另一个for循环中,调用ComPletionservice的这个方法,拿到future对象,再调用future的get方法获取结果,并输出take方法和get方法有异常抛出 ,使用try---catch将其捕获,写上finally代码块,在 finally代码块中调用shoudown方法关闭线程,至此main方法编写完成,整个例子,也编写完成。执行程序,观察执行结果。 从执行结果来看,程序输出执行顺序54321,返回顺序12345,说明 ComPletionservice的确是按照任务完成时间先后顺序返回结果,最后总结一下本节内容。本节介绍了 ComPletionservice它的作用及用法,这里就不再赘述了,在实际开发中只要是遇到执行多个任务,需要按照任务完成时间先后顺序返回结果的,就可以使用 ComPletionservice来解决这些的代码。