1700450410
编写高质量代码:改善Java程序的151个建议 建议124:异步运算考虑使用Callable接口
1700450411
1700450412
多线程应用有两种实现方式,一种是实现Runnable接口,另一种是继承Thread类,这两个方式都有缺点:run方法没有返回值,不能抛出异常(这两个缺点归根到底是Runable接口的缺陷,Thread也是实现了Runnable接口),如果需要知道一个线程的运行结果就需要用户自行设计,线程类自身也不能提供返回值和异常。但是从Java 1.5开始引入了一个新的接口Callable,它类似于Runable接口,实现它就可以实现多线程任务,Callable的接口定义如下:
1700450413
1700450414
public interface Callable<V>{
1700450415
1700450416
//具有返回值,并可抛出异常
1700450417
1700450418
V call()throws Exception;
1700450419
1700450420
}
1700450421
1700450422
实现Callable接口的类,只是表明它是一个可调用的任务,并不表示它具有多线程运算能力,还是需要执行器来执行的。我们先编写一个任务类,代码如下:
1700450423
1700450424
//税款计算器
1700450425
1700450426
class TaxCalculator implements Callable<Integer>{
1700450427
1700450428
//本金
1700450429
1700450430
private int seedMoney;
1700450431
1700450432
//接收主线程提供的参数
1700450433
1700450434
public TaxCalculator(int_seedMoney){
1700450435
1700450436
seedMoney=_seedMoney;
1700450437
1700450438
}
1700450439
1700450440
@Override
1700450441
1700450442
public Integer call()throws Exception{
1700450443
1700450444
//复杂计算,运行一次需要10秒
1700450445
1700450446
TimeUnit.MILLISECONDS.sleep(10000);
1700450447
1700450448
return seedMoney/10;
1700450449
1700450450
}
1700450451
1700450452
}
1700450453
1700450454
这里模拟了一个复杂运算:税款计算器,该运算可能要花费10秒钟的时间,此时不能让用户一直等着吧,需要给用户输出点什么,让用户知道系统还在运行,这也是系统友好性的体现:用户输入即有输出,若耗时较长,则显示运算进度。如果我们直接计算,就只有一个main线程,是不可能有友好提示的,如果税金不计算完毕,也不会执行后续动作,所以此时最好的办法就是重启一个线程来运算,让main线程做进度提示,代码如下:
1700450455
1700450456
public static void main(String[]args)throws Exception{
1700450457
1700450458
//生成一个单线程的异步执行器
[
上一页 ]
[ :1.700450409e+09 ]
[
下一页 ]