java5编程(8)java5线程Callable与Future的应用 (二)

2014-11-24 07:45:56 · 作者: · 浏览: 4
hreadPool2);

// 提交十个任务。
for(int i=1;i<=10;i++){
final int seq = i;
completionService.submit(new Callable() {
@Override
public Integer call() throws Exception {
Thread.sleep(new Random().nextInt(5000));
return seq;
}
});
}
// 拿到 提交任务的结果 。。。
for(int i=0;i<10;i++){
try {
System.out.println(
completionService.take().get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


}
package com.itm.thread;

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;
import java.util.concurrent.Future;

import javax.annotation.processing.Completion;

public class CallableAndFuture {

/**
* @param args
*/
public static void main(String[] args) {
ExecutorService threadPool = Executors.newSingleThreadExecutor();
Future future =
threadPool.submit(
new Callable(){
public String call() throws Exception {
Thread.sleep(2000);
return "hello";
};
}
);
System.out.println("等待结果");
try {
System.out.println("拿到结果 : " + future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}

/**********
*
* 第二种 方法:
*
*/
ExecutorService threadPool2 = Executors.newFixedThreadPool(10);
CompletionService completionService = new ExecutorCompletionService(threadPool2);

// 提交十个任务。
for(int i=1;i<=10;i++){
final int seq = i;
completionService.submit(new Callable() {
@Override
public Integer call() throws Exception {
Thread.sleep(new Random().nextInt(5000));
return seq;
}
});
}
// 拿到 提交任务的结果 。。。
for(int i=0;i<10;i++){
try {
System.out.println(
completionService.take().get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}

也可以借鉴一下:

[java]
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
从本节开始,主要介绍J2SE5.0与线程相关的新特性,新的线程类主要集中在java.util.concurrent
包中,本节实例将介绍如何使用java.util.concurrent.Callable和java.util.concurrent.Future类,
用Callable定义一个任务并启动它,然后用它的Future获取输出结果并停止它.
关键技术剖析:
关于Callable和Future类的关键技术如下:
1.Callable是类似于Runnable的接口,实现Callable接口的类和实现Runable的类都是可被其他线程
执行的任务.
2.Callable和Runnable的区别如下:
1)Callable定义的方法是call,而Runnable定义的方法是run.
2)Callable的call方法可以有返回值,而Runnable的run方法不能有返回值
3)Callable的call方法可抛出异常,而Runn