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并发包之Callable和Future java并发包之Callable和Future java并发包之Callable和Future java并发包之Callable和Future java并发包之Callable和Future
Callable和Future详解: Callable和Runnable有几点不同: (1)Callable规定的方法是call(),而Runnable规定的方法是run(); (2)call()方法可抛出异常,而run()方法是不能抛出异常的。 (3)Runnable不会返回结果,...
主要介绍了Java多线程Callable和Future接口区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Java中的Runnable,Callable,Future,FutureTask的比较的相关资料,需要的朋友可以参考下
Callable,Future的使用方式,里面使用了三种使用方式分别是FutureTask,ExecutorService,ExecutorCompletionService
主要介绍了详解JDK中ExecutorService与Callable和Future对线程的支持的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
主要介绍了java通过Callable和Future来接收线程池的执行结果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要为大家详细介绍了Java concurrency线程池之Callable和Future,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
自留demo,主要是Thread-Callable-Future的基本实现。 参考文章: 1、深入理解Callable https://blog.csdn.net/qq_19431333/article/details/77483763 2、彻底理解Java的Future模式: ...
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务
通过合规策略对服务器进行监控,确保服务器的运行、帐号在服务器上的操作符合预设的规则...进程:监控服务器上的进程,并对某些进程、目录、文件进行标识和监控,只允许指定的进程对指定目录下的指定格式文件执行写操作
2 如何使用FutureTask 、Future、Callable、线程池实现线程2.1 FutureTask + Callable实现多线程2.2 线程池+Future+Callable 实现多线程3 Runnable、Callable、Future和FutureTask之间的关系3.1 整体关系介绍3.2 ...
1. 什么是线程? 2. 什么是线程安全和线程不安全? 3. 什么是⾃旋锁? 4. 什么是CAS? 5. 什么是乐观锁和悲观锁? 6. 什么是AQS?...在Java Concurrency API中有哪些原⼦类(atomic classes)...10. 什么是Callable和Future?
主要介绍了浅谈在Java中使用Callable、Future进行并行编程,具有一定借鉴价值,需要的朋友可以参考下。
什么是 Callable 和 Future? 线程的调度策略 sleep() 和 wait() 有什么区别? 什么是线程同步和线程互斥,有哪几种实现方式? Java 线程数过多会造成什么异常? 并发编程-Java内存模型 ## as-if-srial规则和happens-...
什么是Java中的面向对象编程(OOP)?列举OOP的原则。 什么是Java中的重载和重写?它们之间有什么区别? 什么是Java中的静态方法和实例方法?它们之间有什么区别?...什么是Java中的Callable和Future接口?如何使
CallableCallable与Future在Web应用中的优化案例
2万字Java并发编程面试题合集(含答案,建议收藏) 具体如下 1、在 java 中守护线程和本地线程区别?2、线程与进程的区别?...14、什么是 Callable 和 Future?15、什么是 FutureTask?使用 ExecutorService 启动任
主要介绍了java Callable与Future的详解及实例的相关资料,需要的朋友可以参考下