创建线程的第三种方式Callable和Future CompletionService
来源:互联网 发布:下载qq聊天软件 编辑:程序博客网 时间:2024/06/07 07:26
前面已经指出通过实现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<String> future = newSingleThreadExecutor.submit(new Callable<String>() { 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<Integer> completionService = new ExecutorCompletionService<Integer>(newFixedThreadPool); for(int i=0;i<11;i++){//创建10个任务 final int task=i; completionService.submit(new Callable<Integer>() {//提交任务 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()方法可以获取其返回结果.
0 0
- 创建线程的第三种方式Callable和Future CompletionService
- Callable、Future和CompletionService
- Callable、Future和CompletionService
- Callable、Future和CompletionService
- Callable和Future创建线程
- 创建线程的第三种方式:实现Callable接口
- java 多线程(一)---创建线程的三种方式Thread,Runnable,Callable与Future
- 线程创建2---Callable和Future
- 使用Callable和Future创建线程
- Callable Future 以及CompletionService
- 线程--Callable和Future
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- 多线程,线程池,使用CompletionService通过Future来处理Callable的返回
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- Callable和Future的线程实现
- Callable和CompletionService的运用
- Callable和Future,CompletionService和ExecutorCompletionService的好处和使用场景
- Java中的Runnable、Callable、Future、FutureTask的区别和CompletionService的使用场景
- 程序的内存分配
- sizeof(结构体)和内存对齐以及位域
- Howto let the SAX parser determine the encoding from the xml declaration?
- 自然语言处理(NLP)网上资源整理
- 初识三层
- 创建线程的第三种方式Callable和Future CompletionService
- realloc函数的使用及注意事项
- java类的初始化顺序及继承顺序
- ubuntu安装gcc和编译命令
- 企业搜索领域专业名词翻译
- C# 中 ref 与 out 的区别
- Java学习系列(二)Java注释、标识符、基本数据类型及其转换易错点详解
- C/C++ sort函数的用法
- ssh搭建项目步骤