今天在学习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
+ " 毫秒 " );
}
}
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毫秒
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
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吗?