今天无意中看到一个问题,将一个list分成若干份,每一份交给一个线程处理,那么怎么保证主线程在最后结束呢? 本人初学JAVA,了解也不是很多,百度了大量的资料才将代码写出来,希望各位大佬多多指正.
主线程代码如下:
//手动创建一个list
List<String> list = new ArrayList<>();
list.add("123");
list.add("234");
list.add("345");
list.add("456");
list.add("567");
list.add("678");
list.add("789");
//获取list的长度并计算出要将list分成几段
int size = list.size();
int listNum = 0;
int listSize = 3;
if (size % listSize == 0){
listNum = size / listSize;
}else{
listNum = size / listSize + 1;
}
//初始化一个存放list段的list容器
List<List<String>> listList = new ArrayList<>();
for (int i = 0; i < listNum; i++) {
listList.add(new ArrayList<>());
}
int index = 0;
int count = 0;
//将创建的list存入分段list
for (List<String> stringList : listList) {
for (; index < list.size(); index++) {
if (count % listSize == 0 && count != 0){
count = 0;
break;
}
stringList.add(list.get(index));
count++;
}
}
System.out.println(listList);
int numCount = 0;
//创建线程池
//ExecutorService executorService = Executors.newFixedThreadPool(3);
/**
第一个3:线程池核心线程大小
第二个3:线程池大小
60L:线程存活时间
TimeUnit.SECONDS:存活时间单位
new LinkedBlockingQueue<>(3):队列
new ThreadFactory():创建线程使用的工厂
**/
ExecutorService executorService = new ThreadPoolExecutor(3, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(3), new ThreadFactory() {
//给线程命名
char name = 'a';
@Override
public Thread newThread(Runnable r) {
return new Thread(r,String.valueOf(name++));
}
});
//将每段list交给不同的线程
for (List<String> strings : listList) {
MyTask myTask = new MyTask();
myTask.setList(strings);
Future submit = executorService.submit(myTask);
if ((Boolean) submit.get()){
numCount++;
}
}
executorService.shutdown();
System.out.println("主线程结束" + numCount);
myTask代码如下:
//接收主线程传递的list
private List<String> list;
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
@Override
public Object call() throws Exception {
System.out.println(list);
System.out.println("子线程结束"+Thread.currentThread().getName());
return true;
}
代码运行和主线程的确事在子线程结束后结束的,但因为本人初学Java所以不知道这样写会不会有问题,希望各位大佬不吝赐教,多多指正,谢谢!!!