Callable和Future
Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果。
Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值,
public class Test extends Object{
/**
* @param args
*/
public static void main(String[] args) {
ExecutorService threadPool = Executors.newCachedThreadPool();
final CompletionService<Integer> cs = new ExecutorCompletionService<Integer>(threadPool);
for(int i = 1; i < 5; i++) {
final int taskID = i;
cs.submit(new Callable<Integer>() {
public Integer call() throws Exception {
Thread.sleep(1000);
return taskID;
}
});
}
System.out.println(" ***");
new Thread(){
public void run(){
// 可能做一些事情
for(int i = 1; i < 5; i++) {
try {
System.out.println(cs.take().get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
}.start();
System.out.print(" pong");
}
void c(){
ExecutorService threadPool = Executors.newSingleThreadExecutor();
Future<Integer> future = threadPool.submit(new Callable<Integer>() {
public Integer call() throws Exception {
Thread.sleep(1000);
return new Random().nextInt(100);
}
});
future = threadPool.submit(new Callable<Integer>() {
public Integer call() throws Exception {
Thread.sleep(1000);
int i=new Random().nextInt(100);
System.out.println(i);
return i;
}
});
future = threadPool.submit(new Callable<Integer>() {
public Integer call() throws Exception {
Thread.sleep(1000);
return new Random().nextInt(100);
}
});
System.out.print(" pong");
}
void b(){
for(int i=0;i<5;i++){
Callable<String> c = new Callable<String>(){
public String call() throws Exception {
Thread.currentThread().sleep(2000);
System.out.println("call");
return String.valueOf(new Random().nextInt(100));
}
};
FutureTask<String> future = new FutureTask<String>(c);
new Thread(future).start();
try {
Thread.currentThread().sleep(1000);
String s;
s = future.get();
System.out.println(s);
}
catch (InterruptedException e) {
System.out.println("**1**");
e.printStackTrace();
}catch (ExecutionException e) {
e.printStackTrace();
}
}
System.out.print(" pong");
}
void a(){
//int i=0,j,k=0;
//for(j=0;i<6 && j<10;i++,j++){
//k=i+j;
//}
//System.out.println("i="+i + ",j="+j);
Callable<String> c = new Callable<String>(){
public String call() throws Exception {
Thread.currentThread().sleep(2000);
System.out.println("call");
return String.valueOf(new Random().nextInt(100));
}
};
FutureTask<String> future = new FutureTask<String>(c);
new Thread(future).start();
try {
Thread.currentThread().sleep(1000);
String s;
s = future.get();
System.out.println(s);
}
catch (InterruptedException e) {
System.out.println("**1**");
e.printStackTrace();
}catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*new Thread(){
public void run() {
System.out.print("ping");
}
}.start();
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.print(" pong");
*/
System.out.print(" pong");
}
}
相关推荐
Java使用Callable和Future创建线程操作示例主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项。 首先,Java 5开始,Java提供了...
Callable 和 Future 是 Java 多线程编程中两个重要的接口,它们在处理异步计算和结果获取方面发挥着关键作用。Callable 与 Runnable 相似,但具有更强大的功能,允许任务返回结果并处理异常。 Callable 接口: ...
"Java多线程Callable和Future接口区别" Java多线程Callable和Future接口是Java语言中两个非常重要的接口,它们都是Java多线程编程中使用的接口,用于描述异步计算的结果。在JavaSE5中引入的Callable是一个具有类型...
`Callable`和`Future`的组合是Java并发包中一个强大的工具,它弥补了`Runnable`接口的不足,使得异步编程可以获取到返回值并处理异常。同时,`ExecutorService`作为线程池的实现,为并发编程提供了一种优雅的解决...
Java并发编程中的ExecutorService、Callable和Future Java并发编程中,ExecutorService、Callable和Future是三大核心组件,它们之间紧密相连,共同实现了高效、安全的并发编程。下面我们将详细介绍这些组件的作用和...
Java通过Callable和Future来接收线程池的执行结果 Java中的线程池执行结果获取一直是一个棘手的问题,对于直接继承Thread的方式或实现Runnable接口的方式,都无法获取到线程执行的返回结果。如果线程在执行过程中...
Java中的Runnable、Callable、Future和FutureTask是Java多线程编程中的核心概念,它们各自扮演着不同的角色,共同协作以实现并发任务的管理和执行。 1. **Runnable**: Runnable是最基本的多线程接口,它只有一个`...
Java concurrency线程池之Callable和Future Java concurrency是一个重要的概念,在Java编程中,线程池是一个关键组件。今天,我们将详细介绍Java concurrency线程池之Callable和Future,这两个组件在Java并发编程中...
Callable,Future的使用方式,里面使用了三种使用方式分别是FutureTask,ExecutorService,ExecutorCompletionService
在Java编程中,Callable接口和Future接口是多线程编程中的重要工具,它们在Web应用程序的性能优化中扮演着关键角色。本篇文章将深入探讨Callable和Future如何在Web应用中提高效率并优化资源利用。 Callable接口是...
从Java 1.5开始,引入了Callable和Future接口,为并行编程提供了一种更为高效和便捷的解决方案。 Callable接口是Java并发库中的一个关键接口,位于`java.util.concurrent`包下。Callable接口与Runnable接口类似,但...
在Java多线程编程中,`Callable`接口和`Future`接口是两个重要的组件,它们提供了比`Runnable`接口更强大的功能,尤其是在处理异步计算和结果获取时。本文将详细介绍这两个接口以及如何使用它们来创建自定义任务类以...
Callable 和 Future 是 Java 多线程编程中的两个关键接口,它们在 Java 5 及以上版本引入,以增强并发处理的能力。Callable 接口类似 Runnable,但提供了更丰富的功能,而 Future 对象则用于管理和控制异步计算的...
自留demo,主要是Thread-Callable-Future的基本实现。 参考文章: 1、深入理解Callable https://blog.csdn.net/qq_19431333/article/details/77483763 2、彻底理解Java的Future模式: ...
Runnable、Callable、Future、FutureTask有什么关联.docx
通过合规策略对服务器进行监控,确保服务器的运行、帐号在服务器上的操作符合预设的规则...进程:监控服务器上的进程,并对某些进程、目录、文件进行标识和监控,只允许指定的进程对指定目录下的指定格式文件执行写操作
2 如何使用FutureTask 、Future、Callable、线程池实现线程2.1 FutureTask + Callable实现多线程2.2 线程池+Future+Callable 实现多线程3 Runnable、Callable、Future和FutureTask之间的关系3.1 整体关系介绍3.2 ...
Callable接口和Future接口的组合使用,能够实现多线程并发执行任务,并获取执行结果。 一、Callable接口简介 Callable接口是一个泛型接口,用于表示可以调用并返回结果的代码。它提供了一个call()方法,该方法...
### Java特别篇-关于线程创建的三种方式的总结对比 ... - **使用Callable和Future接口**:这种方式支持返回结果和抛出异常,适合需要计算结果的场景。相对前两种方式更为复杂,但在某些场景下非常有用。
然后,我们使用Callable来定义查评论列表和查点赞列表的任务,并将其提交给线程池。最后,我们使用Future来获取Callable任务的返回值。 异步化改造接口 在上面的代码中,我们可以看到异步化改造接口的实现。我们...