Callable接口与Runnable接口对比的主要优点是Callable接口可以通过Future获取返回值。但是Future接口调用get()方法取得结果时是阻塞的,如果调用Future对象的get()方法时任务尚未执行完,则调用get()方法时一直阻塞到此任务完成。如果前面的任务耗时很多,则后面的任务调用get()方法就呈阻塞状态,大大影响运行效率。主线程不能保证首先获得的是最先完成任务的返回值,这是Future的缺点。

public class MyCallable implements Callable {

private int age;

public MyCallable(int age) {

super();

this.age = age;

}

@Override

public String call() throws Exception {

TimeUnit.SECONDS.sleep(8);

return "返回值 年龄是:" + age;

}

public static void main(String[] args) {

MyCallable myCallable = new MyCallable(22);

int corePoolSize = 2;

int maximumPoolSize = 3;

int keepAliveTime = 5;

TimeUnit unit = TimeUnit.SECONDS;

LinkedBlockingDeque workQueue = new LinkedBlockingDeque();

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);

Future future = threadPoolExecutor.submit(myCallable);

try {

System.out.println(System.currentTimeMillis());

String string = future.get();

System.out.println(string);

System.out.println(System.currentTimeMillis());

} catch (Exception e) {

e.printStackTrace();

}

}

}

打印结果如下:

1470904027660

返回值 年龄是:22

1470904035663

从打印结果看,可见get()方法具有阻塞的特性。

方法submit()不仅可以传入Callable对象,还可以传入Runnable对象,submit()方法支持有返回值和无返回值。

public class Run {

public static void main(String[] args) {

try {

Runnable runnable = new Runnable() {

@Override

public void run() {

System.out.println("打印的信息");

}

};

ExecutorService executorService = Executors.newCachedThreadPool();

Future future = executorService.submit(runnable);

System.out.println(future.get() + " " + future.isDone());

} catch (Exception e) {

e.printStackTrace();

}

}

}

打印结果如下:

打印的信息

null true

方法isDone()无阻塞特性。

使用ExecutorService接口中的方法submit(Runnable, T result)

public class User {

private String username;

private String password;

//省略getter setter

}

public class MyRunnable implements Runnable {

private User user;

public MyRunnable(User user) {

super();

this.user = user;

}

@Override

public void run() {

try {

TimeUnit.SECONDS.sleep(2);

} catch (InterruptedException e) {

e.printStackTrace();

}

user.setUsername("admin");

user.setPassword("123456");

}

}

public class Main {

FutureTask task;

public static void main(String[] args) {

try {

User user = new User();

MyRunnable myRunnable = new MyRunnable(user);

int corePoolSize = 10;

int maximumPoolSize = 10;

int keepAliveTime = 10;

TimeUnit unit = TimeUnit.SECONDS;

LinkedBlockingDeque workQueue = new LinkedBlockingDeque<>();

ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);

Future future = executor.submit(myRunnable, user);

System.out.println(System.currentTimeMillis());

System.out.println(user.getUsername() + "-" + user.getPassword());

user = future.get();

System.out.println(user.getUsername() + "-" + user.getPassword());

System.out.println(System.currentTimeMillis());

} catch (Exception e) {

e.printStackTrace();

}

}

}

控制台打印结果如下:

1470908214853

null-null

admin-123456

1470908216855

java并发编程核心方法与框架_Java并发编程核心方法与框架-Future和Callable的使用...相关推荐

  1. java编程executor框架_Java并发编程 - Executor框架(一)Executor,

    1.并发编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后将这些任务提交给一个Executor执行, Executor.execute(Runnalbe) .Executor在执 ...

  2. java的并发框架_java并发框架有哪些

    展开全部 Java并发框架java.util.concurrent是JDK5中引入到标准库中的(采用的32313133353236313431303231363533e78988e69d8331333 ...

  3. java 代码段 执行超时 抛异常_Java 并发队列详解TransferQueue、BlockingQueue、BlockingDeque

    阻塞队列 BlockingQueue java.util.concurrent 包里的 BlockingQueue 接口表示一个线程安放入和提取实例的队列. BlockingQueue 用法 Bloc ...

  4. freemarker的测试结果框架_java必背综合知识点总结(框架篇)

    框架篇 一.Struts1的运行原理 在启动时通过前端总控制器ActionServlet加载struts-config.xml并进行解析,当用户在jsp页面发送请求被struts1的核心控制器Acti ...

  5. java框内的值怎么同步_java并发编程使用锁进行数据同步操作一

    项目中总是出现招标项目超投的情况,最开始总是觉得应该使用框架Hibernate自带的并发策略中的乐观锁(version)解决问题,参考了很多网上的资料,也参考了Hibernate的帮助文档,由于对Hi ...

  6. java公平锁和非公平锁_java并发编程学习之再谈公平锁和非公平锁

    在java并发编程学习之显示锁Lock里有提过公平锁和非公平锁,我们知道他的使用方式,以及非公平锁的性能较高,在AQS源码分析的基础上,我们看看NonfairSync和FairSync的区别在什么地方 ...

  7. java程序设计简明教程张晓龙_Java网络编程简明教程

    Java网络编程简明教程 网络编程 计算机网络相关概念 计算机网络是两台或更多的计算机组成的网络,同一网络内的任意两台计算机可以直接通信,所有计算机必须遵循同一种网络协议. 互联网 互联网是连接计算机 ...

  8. java api 框架_java常用对象API之集合框架

    说到集合框架,其实刚开始学的时候有点自我感觉很简单,自己认为就是集合类中的框架之类的,但是当自己简单把它过了一变后发现懵里懵懂的,什么都没懂,于是自己又认认真真的看了一遍,才弄明白. 说到集合框架就不 ...

  9. 线程池框架_Java并发——Executor框架详解(Executor框架结构与框架成员)

    一.什么是Executor框架? 我们知道线程池就是线程的集合,线程池集中管理线程,以实现线程的重用,降低资源消耗,提高响应速度等.线程用于执行异步任务,单个的线程既是工作单元也是执行机制,从JDK1 ...

最新文章

  1. 智能驾驶L2的黄金时代,打磨地图是关键
  2. 计算机培训操作规程,电脑裁床操作规程
  3. 数据结构: 线索化二叉树
  4. Java基础学习笔记之:System类;Math类;Arrays类BigInteger,BigDecimal
  5. Java中的enum详细解析------全面掌握Java的enum类
  6. javascript精雕细琢(三):作用域与作用域链
  7. Zabbix 工作原理
  8. 一位Erlang程序员的自白
  9. springmvc中实现quartz定时任务
  10. ajax获取session值_【JavaWeb】91:Cookie与Session
  11. [Python 应用:爬虫] Selenium 之 XPath 语法
  12. eclipse ADT完整环境下载
  13. 计算机快速看图教程,cad快速看图制图
  14. 00 VirtualBox安装Windows7 32位系统
  15. python黑白方格画
  16. 百度竞价数据分析技巧!
  17. Chrome浏览器必备插件推荐
  18. ft232h引脚_AM3356BZCZD60--越秀--回收各种内存IC
  19. React中关于props的那些事
  20. Unity 水墨风格Shader

热门文章

  1. Everything的下载
  2. Fragment向ChildFragment传值
  3. Android调用系统相机和相册(更换微信头像)
  4. vue安装less并全局引入less/sass文件
  5. vue 打包上线后字体图标不显示
  6. Android开发之EdittText输入0开头金额的限制算法
  7. iOS 静态度制作方法详细
  8. sql入侵 mysql日志_服务器入侵日志分析(一)——mysql日志位置确定
  9. 自动化运维之部署Puppet
  10. 【技术人快报】美军计划换用Linux系统+安卓系统“克隆漏洞”曝光