Java多线程调用并获取返回值

Java多线程调用并获取返回值

main1使用Future是最基本的方法,会造成阻塞,适合执行方法少、时间短的;
main2是功能比较强大的,使用了ExecutorCompletionService保存已经执行完的方法,适合执行不确定时间的需求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class TestCallable {

public static void main1(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
try {
List<Future<Integer>> list = new ArrayList<>();
for(int i = 0; i < 10; i++) {
list.add(executor.submit(new Task(i)));
}
/**
* 用List保存Future
* 用get来获取返回结果,如果Future没有执行完,再调用get方法时就会阻塞
* 导致可能执行完的操作没有即时返回
*/
for(Future<Integer> f : list) {
int value = f.get();
System.out.println(value);
}

} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
executor.shutdown();
}
public static void main2(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
/**
* ExecutorCompletionService获取先执行完的任务返回值,这样就不会造成阻塞
*/
CompletionService<Integer> completion = new ExecutorCompletionService<>(executor);
try {
for(int i = 0; i < 10; i++) {
completion.submit(new Task(i));
}
for(int i = 0 ; i < 10; i++) {
int ret = completion.take().get();
System.out.println(ret);
}

} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
executor.shutdown();
}

}
class Task implements Callable<Integer>{
private int id;
public Task(int id) {
this.id = id;
}

@Override
public Integer call() throws Exception {
if(id%2==0)
Thread.sleep((long) (Math.random()*10000));
System.out.println("run task["+id+"]");
return id;
}

}
-------------已经触及底线 感谢您的阅读-------------

本文标题:Java多线程调用并获取返回值

文章作者:趙小傑~~

发布时间:2019年07月05日 - 21:47:34

最后更新:2019年07月26日 - 23:32:12

原始链接:https://cnsyear.com/posts/f77c1542.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%