使用线程池和FutureTask实现多线程读取列表
时间: 2023-07-07 10:10:01 浏览: 129
好的,我可以为你解答这个问题。
首先,你需要创建一个线程池,可以使用Java提供的ThreadPoolExecutor类。然后,你需要将任务封装成FutureTask对象,并将其添加到线程池中。
在这个例子中,我们假设有一个名为list的列表,需要使用多线程方式读取。以下是实现代码:
```
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
public class MultiThreadListReader {
public static void main(String[] args) {
// 创建一个包含5个线程的线程池
ExecutorService executor = Executors.newFixedThreadPool(5);
// 创建一个列表
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add(i);
}
// 创建一个FutureTask列表
List<FutureTask<List<Integer>>> taskList = new ArrayList<>();
// 将任务封装成FutureTask对象,并添加到列表中
for (int i = 0; i < 5; i++) {
final int startIndex = i * 20;
FutureTask<List<Integer>> task = new FutureTask<>(new Callable<List<Integer>>() {
@Override
public List<Integer> call() throws Exception {
List<Integer> subList = new ArrayList<>();
for (int j = startIndex; j < startIndex + 20; j++) {
subList.add(list.get(j));
}
return subList;
}
});
taskList.add(task);
executor.submit(task);
}
// 等待所有任务完成,并将结果合并
List<Integer> result = new ArrayList<>();
for (FutureTask<List<Integer>> task : taskList) {
try {
result.addAll(task.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
// 打印结果
System.out.println(result);
// 关闭线程池
executor.shutdown();
}
}
```
在这个例子中,我们创建了一个包含5个线程的线程池,将列表分成5份,每份20个元素,每个线程负责读取其中一份元素,并将结果存入子列表中。最后,我们将所有子列表合并成一个结果列表,并打印出来。
注意,我们使用了FutureTask对象来封装任务,并且通过调用get()方法来获取任务的结果。同时,我们也需要处理可能出现的InterruptedException和ExecutionException异常。
阅读全文