java线程池的应用示例(处理list数据)
这两天闲来无事,研究了一下java的线程池,这里不做深入了解,先看下有关类和接口有哪些,以及关系。
- 创建线程池要用到Executors工程类,不是Executor接口哦!
- 通过Executors可以生成两种线程池的实现类:ThreadPoolExecutor和ScheduledTheadPoodExecutor。这两个类的实现主要区别是后者实现了有关定时任务线程。
还是需要实际上手的,所以简单的写了个示例,用于展示多线程的应用,给以只管感受!
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
public class Test{
//利用线程池对于一个长数组处理
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(10);
List<Integer> list = new ArrayList<>();
for(int i= 1;i<=1000; i++){
list.add(i);
}
List<List<Integer>> splistList = splistList(list,100);
ArrayList<Future<ArrayList<Integer>>> resultList = new ArrayList<Future<ArrayList<Integer>>>();
for(int i=0;i<splistList.size();i++){
List<Integer> temp = splistList.get(i);
Future future = executorService.submit(new Callable<Object>() {
@Override
public Object call() throws Exception {
List<Integer> resultTemp = new ArrayList<>();
for(int a: temp){
resultTemp.add(a+2);
}
return resultTemp;
}
});
resultList.add(future);
}
//关闭线程池,但是不是立即关闭,是等待所有线程完毕,不会新开线程
executorService.shutdown();
List<Integer> lastList = new ArrayList<>();
while(true){
//判断线程池的线程是否都已经执行完毕
if(executorService.isTerminated()){
System.out.println("长度为:" + resultList.size());
for(int i = 0; i< resultList.size(); i++){
try {
lastList.addAll(resultList.get(i).get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
break;
}
System.out.println("还没完");
}
System.out.println(lastList.get(list.size()-1));//查看最后一个数
}
public static List<List<Integer>> splistList(List<Integer> list, int splitSize) {
if (null == list) {
return null;
}
int listSize = list.size();
List<List<Integer>> newList = new ArrayList<List<Integer>>();
if (listSize < splitSize) {
newList.add(list);
return newList;
}
int addLength = splitSize;
int times = listSize / splitSize;
if (listSize % splitSize != 0) {
times += 1;
}
int start = 0;
int end = 0;
int last = times - 1;
for (int i = 0; i < times; i++) {
start = i * splitSize;
if (i < last) {
end = start + addLength;
} else {
end = listSize;
}
newList.add(list.subList(start, end));
}
return newList;
}
}