1700450459
1700450460
ExecutorService es=Executors.newSingleThreadExecutor();
1700450461
1700450462
//线程执行后的期望值
1700450463
1700450464
Future<Integer>future=es.submit(new TaxCalculator(100));
1700450465
1700450466
while(!future.isDone()){
1700450467
1700450468
//还没有运算完成,等待200毫秒
1700450469
1700450470
TimeUnit.MILLISECONDS.sleep(200);
1700450471
1700450472
//输出进度符号
1700450473
1700450474
System.out.print(”#”);
1700450475
1700450476
}
1700450477
1700450478
System.out.println(”\n计算完成,税金是:”+future.get()+“元”);
1700450479
1700450480
es.shutdown();
1700450481
1700450482
}
1700450483
1700450484
在该段代码中,Executors是一个静态工具类,提供了异步执行器的创建能力,如单线程执行器newSingleThreadExecutor、固定线程数量的执行器newFixedThreadPool等,一般它是异步计算的入口类。Future关注的是线程执行后的结果,比如有没有运行完毕,执行结果是多少等。此段代码的运行结果如下所示:
1700450485
1700450486
##################################################
1700450487
1700450488
计算完成,税金是:10元
1700450489
1700450490
执行时,“#”会依次递增,表示系统正在运算,为用户提供了运算进度。此类异步计算的好处是:
1700450491
1700450492
尽可能多地占用系统资源,提供快速运算。
1700450493
1700450494
可以监控线程执行的情况,比如是否执行完毕、是否有返回值、是否有异常等。
1700450495
1700450496
可以为用户提供更好的支持,比如例子中的运算进度等。
1700450497
1700450498
1700450499
1700450500
1700450502
编写高质量代码:改善Java程序的151个建议 建议125:优先选择线程池
1700450503
1700450504
在Java 1.5之前,实现多线程编程比较麻烦,需要自己启动线程,并关注同步资源,防止出现线程死锁等问题,在1.5版之后引入了并行计算框架,大大简化了多线程开发。我们知道一个线程有五个状态:新建状态(New)、可运行状态(Runnable,也叫做运行状态)、阻塞状态(Blocked)、等待状态(Waiting)、结束状态(Terminated),线程的状态只能由新建转变为了运行态后才可能被阻塞或等待,最后终结,不可能产生本末倒置的情况,比如想把一个结束状态的线程转变为新建状态,则会出现异常,例如如下代码会抛出异常:
1700450505
1700450506
public static void main(String[]args)throws Exception{
1700450507
1700450508
//创建一个线程,新建状态
[
上一页 ]
[ :1.700450459e+09 ]
[
下一页 ]