ExecutorService.submit(Callable).get()不并发执行

今天在学习Callable的用法,

public class CallableTry {

class Task implements Callable < Long > {
private long times;
private String name;

public Task( long times, String name) {
this .name = name;
this .times = times;
}

@Override
public Long call() {
System.out.println(name
+ " 开始执行, time[ " + times + " ]... " );
long before = System.currentTimeMillis();
for ( int i = 0 ; i < times; i ++ )
;
long after = System.currentTimeMillis();
System.out.println(name
+ " 执行结束. " );
long cost = after - before;
System.out.println(name
+ " 耗时 : " + cost);
return cost;
}
}

/**
*
@param args
*/
public static void main(String[] args) throws ExecutionException,
InterruptedException {
long total = 0 ;
CallableTry tr
= new CallableTry();
ExecutorService pool
= Executors.newCachedThreadPool();
Random rand
= new Random();
int count = 10 ;
for ( int i = 0 ; i < count; i ++ ) {
total
+= pool.submit(
tr.
new Task( 10000000 * rand.nextInt( 100 ), i + " 任务 " )).get();
System.out.println(
" next task... " );
}
pool.shutdown();
while ( ! pool.isTerminated())
;
System.out.println(
" 耗时: " + total + " 毫秒, 平均用时: " + total * 1.0 / count
+ " 毫秒 " );
}

}

打印结果为:

0任务开始执行, time[860000000]...
0任务执行结束.
0任务耗时 :4750
next task...
1任务开始执行, time[430000000]...
1任务执行结束.
1任务耗时 :2343
next task...
2任务开始执行, time[500000000]...
2任务执行结束.
2任务耗时 :1703
next task...
3任务开始执行, time[990000000]...
3任务执行结束.
3任务耗时 :3344
next task...
4任务开始执行, time[340000000]...
4任务执行结束.
4任务耗时 :1156
next task...
5任务开始执行, time[640000000]...
5任务执行结束.
5任务耗时 :2250
next task...
6任务开始执行, time[880000000]...
6任务执行结束.
6任务耗时 :3032
next task...
7任务开始执行, time[800000000]...
7任务执行结束.
7任务耗时 :2781
next task...
8任务开始执行, time[450000000]...
8任务执行结束.
8任务耗时 :1547
next task...
9任务开始执行, time[980000000]...
9任务执行结束.
9任务耗时 :3375
next task...
耗时:26281毫秒, 平均用时:2628.1毫秒

运行了很多次,时间上有差异,但是执行顺序却一直是这个顺序...

而把

 total += pool.submit(
tr.
new Task(10000000 * rand.nextInt(100), i + "任务")).get();的.get()去掉后
结果是:
next task...
next task...
0任务开始执行, time[880000000]...
next task...
next task...
next task...
next task...
next task...
next task...
next task...
next task...
2任务开始执行, time[790000000]...
1任务开始执行, time[230000000]...
3任务开始执行, time[270000000]...
4任务开始执行, time[490000000]...
5任务开始执行, time[950000000]...
6任务开始执行, time[950000000]...
7任务开始执行, time[630000000]...
8任务开始执行, time[510000000]...
9任务开始执行, time[740000000]...
1任务执行结束.
1任务耗时 :4484
3任务执行结束.
3任务耗时 :5094
7任务执行结束.
7任务耗时 :8281
4任务执行结束.
4任务耗时 :9079
9任务执行结束.
9任务耗时 :9000
8任务执行结束.
8任务耗时 :9860
5任务执行结束.
5任务耗时 :14843
6任务执行结束.
6任务耗时 :15641
2任务执行结束.
2任务耗时 :18297
0任务执行结束.
0任务耗时 :19000


是不是.get()之后就不并发执行了呢?那它还是concurrency吗?

转载于:https://www.cnblogs.com/adaikiss/archive/2010/12/24/1915735.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值