java 并发runable,callable,future,futureTask
转载自:http://www.cnblogs.com/dolphin0520/p/3949310.html
package future_call; import java.util.concurrent.Callable; /**
* Created by luozhitao on 2017/8/10.
*/
public class Task implements Callable<Integer> {
// @Override
public Integer call() throws Exception { System.out.println("子线程在进行计算"); Thread.sleep(10000);
System.out.println("子线程睡眠完毕");
int sum=0;
for (int i=0;i<100;i++){ sum+=i; } return sum;
}
}
1.使用Callable+Future
package future_call; import java.util.concurrent.*; /**
* Created by luozhitao on 2017/8/10.
*/
public class Task_test { public static void main(String [] args){ ExecutorService executorService= Executors.newCachedThreadPool();
Task task=new Task();
Future<Integer> future=null;
try{
// executorService future=executorService.submit(task);
System.out.println("线程池关闭之前");
executorService.shutdown();
System.out.println("线程池关闭之后"); }catch (RejectedExecutionException e){System.out.println(e);} try{ Thread.sleep(1000); }catch (InterruptedException e){e.printStackTrace();} System.out.println("主线程在进行计算"); try{ System.out.println(future.get()); }catch (InterruptedException e){e.printStackTrace();} catch (ExecutionException e){e.printStackTrace();} }
}
2.使用Callable+FutureTask
package future_call; import java.util.concurrent.*; /**
* Created by luozhitao on 2017/8/10.
*/
public class future_task1 { public static void main(String [] args){ ExecutorService executorService= Executors.newCachedThreadPool();
Task task=new Task();
FutureTask<Integer> futureTask=new FutureTask<Integer>(task);
try {
/*
executorService.submit(futureTask);
executorService.shutdown();
*/
Thread thread=new Thread(futureTask);
thread.start(); }catch (RejectedExecutionException e){e.printStackTrace();} try {
Thread.sleep(1000);
System.out.println("主线程睡眠完毕");
}catch (InterruptedException e){e.printStackTrace();} try{ System.out.println(futureTask.get()); }catch (InterruptedException e){e.printStackTrace();}catch (ExecutionException e){e.printStackTrace();} } }
如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。
/**
* 提交runnable则没有返回值, future没有数据
*/
Future<?> result = mExecutor.submit(new Runnable() { @Override
public void run() {
fibc(20);
}
}); System.out.println("future result from runnable : " + result.get());
java 并发runable,callable,future,futureTask的更多相关文章
- Java 并发编程——Callable+Future+FutureTask
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...
- Java多线程:Callable,Future,FutureTask
一.Future Future和Callable基本是成对出现的,Callable负责产生结果,Future负责获取结果. 1.Callable接口类似于Runnable,只是Runnable ...
- Java并发:Callable、Future和FutureTask
Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一 ...
- 【原创】JAVA并发编程——Callable和Future源码初探
JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...
- Java并发编程笔记之FutureTask源码分析
FutureTask可用于异步获取执行结果或取消执行任务的场景.通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过Fu ...
- java Runnable、Callable、FutureTask 和线程池
一:Runnable.Callable.FutureTask简介 (1)Runnable:其中的run()方法没有返回值. ①.Runnable对象可以直接扔给Thread创建线程实例,并且创建的线程 ...
- Callable,Future,FutureTask
1.概念定义 2.实现例子 3.总结 1.概念定义 1.Callable Callable是一个接口,效果类似Runnable接口.实现该接口,然后,耗时操作在call()方法中执行.与Run ...
- 12 Callable & Future & FutureTask
创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用 ...
- Java并发案例04---Future和 FutureTask
4.Future和 FutureTask 4.1 Future是Callable的返回结果. 它有三个功能 1.判断任务是否完成 2.能够中断任务 3.能够获取任务返回结果 4.2 FutureTas ...
随机推荐
- Secondary ,Supplementary alignment 和bwa mem的-M -Y参数
1.supplementary alignment supplementary alignment是指一条read的一部分和参考区域1比对成功,另一部分和参考区域2比对成功,参考区域1和参考区域2没有 ...
- Linux网络配置脚本
#!/bin/bash ip=$1 if [ -f "/etc/sysconfig/network-scripts/ifcfg-bond1" ] then break else # ...
- 黑苹果Yosemite 10.10.1懒人版完美安装及简单驱动设置
1.硬件概要 CPU: 英特尔 Xeon E3-1230 V2 (四核)主板: 技嘉 H77-DS3H (Intel H77 (Panther Point Base))内存: 8 GBytes显卡: ...
- javascript设计模式 - 解释器模式(interpreter)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- cf780c
C. Andryush ...
- Docker入门使用
先来一波docker的指令: docker inspect 容器id 查询容器信息 docker stop 容器id 停止容器id docker rm 容器id ...
- OwinStartup not firing
https://stackoverflow.com/questions/20203982/owinstartup-not-firing 缺少依赖 Make sure you have installe ...
- Oracle imp 导入数据出现 ORA-12560
错误如下: D:\software\xfwebdb2015-05-11\autobackup>imp Import: Release 10.2.0.1.0 - Production on 星期三 ...
- spark学习(RDD案例实战)
练习0(并行化创建RDD) 先启动spark-shell 通过并行化生成rdd scala> val rdd1 = sc.parallelize(List(63,45,89,23,144,777 ...
- C语言中单引号和双引号
写惯了python对单引号和双引号都混了.. C语言中的单引号和双引号含义迥异,用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值,因此,采用ASCII字符集的 ...