博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java核心知识点学习----创建线程的第三种方式Callable和Future CompletionService
阅读量:6463 次
发布时间:2019-06-23

本文共 2701 字,大约阅读时间需要 9 分钟。

前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的.

Callabel接口可以看成是Runnable接口的增强版,只不过其线程执行体call()方法比run方法更加强大罢了:

>>call()方法中可以有返回值

>>call()方法中可以声明抛出异常.

一.创建线程的第三种方式----使用Callable对象进行创建

package com.amos.concurrent;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;/** * @ClassName: CallableAndFuture * @Description: 多线程中的Callable和Future学习 * @author: amosli * @email:hi_amos@outlook.com * @date Apr 22, 2014 12:07:26 AM */public class CallableAndFuture {    public static void main(String[] args) throws Exception, ExecutionException {        ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();        Future
future = newSingleThreadExecutor.submit(new Callable
() { public String call() throws Exception { Thread.sleep(20); return "hi,amos"; } }); // System.out.println("future:"+future.get(1,TimeUnit.MILLISECONDS));//等待指定的时间 System.out.println("future:" + future.get()); }}

效果如下:

注:

1.这里要注意的是,创建线程时执行任务不是用execute()方法去执行了,而是用submit()方法.

2.同时要注意,这里call()方法返回值,要和上面的保持一致.

3.另外,可以设置最大等待时间,就是等待程序的返回值,这里使用get()方法.

4.其常用的其它方法有cancel(),isCancelled(),isDone(),分别表示取消关联的任务,是否已经取消,任务是否已经完成.

二.CompeltionService

CompeltionService主要用于提交一组Callable对象,其take方法用于返回已完成的callable任务的Future对象.可以用麦子收割来作比喻,种了10亩地的麦子,哪一块先成熟先收割哪一块.

举例:

package com.amos.concurrent;import java.util.Random;import java.util.concurrent.Callable;import java.util.concurrent.CompletionService;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorCompletionService;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CallableAndFuture {    public static void main(String[] args) throws Exception, ExecutionException {ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(10);        CompletionService
completionService = new ExecutorCompletionService
(newFixedThreadPool); for(int i=0;i<11;i++){
//创建10个任务 final int task=i; completionService.submit(new Callable
() {
//提交任务 public Integer call() throws Exception { Thread.sleep(new Random().nextInt(3000));//最多3秒 return task; } }); } //take for(int i=0;i<11;i++){ System.out.println("已完成的任务:"+completionService.take().get()); }}

效果如下图所示:

注:由结果也可以看出来,其随机结果是根据任务的先后完成顺序来的,使用其take()方法可以获取其返回结果.

 

 

 

转载地址:http://ikhzo.baihongyu.com/

你可能感兴趣的文章
街道管理
查看>>
可以免费下载视频素材和模板网站汇总
查看>>
node中非常重要的process对象,Child Process模块
查看>>
Webserver管理系列:3、Windows Update
查看>>
DataGridView 输入数据验证格式(实例)
查看>>
HDOJ 2151
查看>>
Foundation框架 - 快速创建跨平台的网站页面原型
查看>>
open-falcon
查看>>
doc2vec使用说明(一)gensim工具包TaggedLineDocument
查看>>
Q:图像太大,在opencv上显示不完全
查看>>
利用ItextPdf、core-renderer-R8 来生成PDF
查看>>
NavigationController的使用
查看>>
多线程编程之Windows环境下创建新线程
查看>>
Unity3D NGUI 给button按钮添加单间事件
查看>>
密码的校验.大小写字母,数字,特殊字符中的至少3种
查看>>
ios 不同sdk4.3 6.0版本号,关于方法的兼容性的通用方法
查看>>
Webstorm常用快捷键备忘
查看>>
js滚动加载到底部
查看>>
Virtualbox 虚拟机网络不通
查看>>
java概念基础笔记整理
查看>>