Runnable作为线程的接口已经广为大家所知。
但是在执行任务的时候如果想要返回结果怎么办?如果想抛出异常怎么办?
这些都是Runnable无法做到的。这时候另一个线程接口就出现了: Callable:
V call() throws Exception;
Oh,perfect! 可以返回值,可以抛异常!
我们知道Runnable是通过Thread 类来执行的:new Thread(new Runnable(){..}).start();
那么Callable呢?
这个是通过RunnableFuture来执行的(当然RunnableFuture也可以用来执行Runnable)。
RunnableFuture的一个常用子类是:FutureTask.
下面的代码演示了这几个接口的用法:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
@SuppressWarnings("unchecked")
public class TestTask {
private FutureTask<String> task=new FutureTask(new Callable(){
public String call() throws Exception {
return "hello";
}
}
);
private ExecutorService exeService=Executors.newFixedThreadPool(4);
public static void main(String args[]){
TestTask test=new TestTask();
test.testFuture();
test.testExecutor();
}
public void testFuture(){
task.run();
String result="";
try {
result = task.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("task returns :"+result);
}
public void testExecutor(){
exeService.execute(task);
String result="";
try {
result = task.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("task submmited and run:"+result);
}
}
细心的看官可能已经发现了,这里面用到了另一个类:ExecutorService.
这是java concurrent执行框架的一部分。
这个框架包含了Executor(能执行Runnable),ExecutorService(Executor的子类,加强了对Runnable生命周期的管理),Executors(Executor和ExecutorService的工厂方法).在上面是通过Executors的静态方法产生一个
ThreadPoolExecutor来执行Runnable.
分享到:
相关推荐
java concurrent 阻塞队列 线程 里面有详细的例子,下载后请认真阅读里面的内容,可能有点难以理解,请耐心
Java Concurrent in practice (animated)
java.util.concurrent.Callable API介绍和简单案例
java concurrent 包 详细解析
Runnable是执行工作的独立任务,但是它不返回任何值,如果你希望任务在完成时能够返回一个值,那么可以实现Callable接口而不是Runnable接口。在Java SE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表示...
使用java concurrent调用xmlp api生成pdf
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用...Callable是需要使用java.util.concurrent.ExecutorService.submit(Callable)方
JAVA的CONCURRENT用法详解.pdf
Java Concurrent处理并发需求.txt
java concurrent 多线程 PPT
java concurrent包分类结构图
详细的java 多线程相关知识 并附有相关练习题
资深Java专家10年经验总结,全程案例式讲解,首本全面介绍Java多线程编程技术的专著 结合大量实例,全面讲解Java多线程编程中的并发访问、线程间通信、锁等最难突破的核心技术与应用实践 封底 Java多线程无处不在,...
EBS java concurrent program的实现
面试 面试_Java一些常见面试题+题解之多线程开发_JavaConcurrent
2 如何使用FutureTask 、Future、Callable、线程池实现线程2.1 FutureTask + Callable实现多线程2.2 线程池+Future+Callable 实现多线程3 Runnable、Callable、Future和FutureTask之间的关系3.1 整体关系介绍3.2 ...
java并发工具包 java.util.concurrent中文版pdf
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
资源JavaConcurrent实用知识库分享知识分享
JUC使用指导手册 http://tutorials.jenkov.com/java-util-concurrent/blockingqueue.html 中文译文