多线程有两种实现方式:

一种是实现Runnable接口,另一种是继承Thread类,这两种方式都有缺点,run方法没有返回值,不能抛出异常(这两个缺点归根到底是Runable接口的缺陷,Thread也是实现了Runnable接口),如果需要知道一个线程的运行结果就需要用户自行设计,线程类自身也不能提供返回值和异常.

但是从JDK1.5之后引入了一个新的接口Callable,它类似于Runnable接口,实现它就可以实现多线程任务,Callable接口的定义如下:

public interface Callable<V> {

    V call() throws Exception;
}

实现Callable接口的类,只是表明它是一个可以调用的任务,并不代表它具有多线程运算的能力,还是需要执行器来执行的,编写一个任务类:

 import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit; public class Client {
public static void main(String[] args) throws Exception {
//生成一个单线程的异步执行器
ExecutorService es = Executors.newSingleThreadExecutor();
//线程执行后的期望值
Future<Integer> future = es.submit(new TaxCalculator(100));
while(!future.isDone()){
//还没有运算完成,等待10毫秒
TimeUnit.MILLISECONDS.sleep(200);
//输出进度符号
System.out.print("#");
}
System.out.println("\n计算完成,税金是:"+ future.get() + " 元");
//关闭异步执行器
es.shutdown();
}
} //税款计算器
class TaxCalculator implements Callable<Integer> {
//本金
private int seedMoney;
//接收主线程提供的参数
public TaxCalculator(int _seedMoney) {
seedMoney = _seedMoney;
}
@Override
public Integer call() throws Exception {
//复杂计算,运行一次需要10秒
TimeUnit.MILLISECONDS.sleep(10000);
return seedMoney /10;
}
}

这里模拟了一个复杂运算,这个运算可能要花费10秒钟的时间,此时不能让用户一直等着,需要给 用户输出点什么,让用户知道系统还在运行,这也是友好性的体现,用户输入既有输出,若耗时较长,则显示进度.

如果我们直接计算,就只有一个main线程,是不可能有友好提示的,如果税金不计算完毕,也不会执行后续动作,所以此时最好的方法就是重启一个线程来运算.让main线程做进度提示.

改段代码中,Executors是一个静态工具类,提供了异步执行器的创建能力,如单线程执行器newSingleThreadExecutor,固定线程数量的执行器newFixedThreadPool等,一般它是异步计算的入口类.

Future关注的是线程执行后的结果.比如有没有运行完毕,执行结果是多少等.此段代码的运行结果如下:

###################################################
计算完成,税金是:10 元

"#"会依次递增,标识系统正在计算.

此类异步运算的好处是:

1.尽可能多的占用系统资源.提供快速运算.

2.可以监控线程执行的情况,比如是否执行完毕,是否有返回值,是否有异常.

3.可以为用户提供更好的支持,比如例子中的运算进度等.

最新文章

  1. zipArchive
  2. spring中配置了事务,数据业务层捕获异常,事务配置不成功?
  3. VS的工程链接优化的问题
  4. MySQL数据库备份和还原的常用命令小结
  5. 纯CSS制作“跳动的心”demo
  6. SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-006-定义切面使用xml
  7. 一步一步教你做ios推送
  8. dubbo+zookeeper+springmvc+mybatis+shiro+redis架构
  9. Word+PS制作拼音表格
  10. 在react中使用vis.js
  11. ElasticSearch(七):Java操作elasticsearch基于smartcn中文分词查询
  12. [数学杂志]AML
  13. Nginx+Tomcat配置负载均衡(一)
  14. 3ds max学习笔记-- 复合对象运算
  15. Linux 防火墙:Netfilter iptables
  16. 关于Excel导出实例(适合新手,比较详细)
  17. veri HDL modeisim仿真:test bench文件编写
  18. poj2763树链剖分边权+区间和
  19. VMware相关服务启动关闭脚本
  20. java-学习8

热门文章

  1. 第二百三十七天 how can I 坚持
  2. PC问题-可以PING通IP,PING名字不通,可以远程,但不能访问共享文件夹?
  3. c# socket编程简单例子
  4. 创建类模式(一):工厂方法(Factory Method)
  5. 网络复习之TCP
  6. 教你50招提升ASP.NET性能(十七):不要认为问题只会从业务层产生
  7. 【android-cocos2d-X 环境配置】在Mac下搭建Cocos2d-X-android开发环境!
  8. uva11324 The Largest Clique --- 强连通+dp
  9. 关于MVC中DropDownListFor的一个bug
  10. python写的多线程下载工具