前言
以前用过后来忘了,写一个demo记录一下
目的是将一个List集合,通过多线程执行一个逻辑后,返回一个结果集
环境
win11专业21H2
Idea2021.3.3
jdk1.8.0_131
main
一个List任务有ABCD四个字母,分成三条线程执行,第一次执行ABC三条线程,第二次执行D一条线程
public class TestThread {
public static void main(String[] args) throws ExecutionException, InterruptedException {
int threadNum = 3;
//模拟一个任务
List<String> inte = new ArrayList<>();
inte.add("A");
inte.add("B");
inte.add("C");
inte.add("D");
//算出一共需要执行多少次
int countNum = inte.size() / threadNum;
int remainder = inte.size() % threadNum;
if (remainder != 0) {
countNum += 1;
}
//创建一个拥有固定线程数的线程池对象
ExecutorService exs = Executors.newFixedThreadPool(threadNum);
List<FutureTask> resultList = new ArrayList<>();
//一共需要执行次数
for (int i = 0; i < countNum; i++) {
//每次几条线程
for (int j = 0; j < threadNum; j++) {
int indexNum = (i * threadNum) + j;
//执行到任务的最后一次,直接跳出
if (indexNum >= inte.size()) {
break;
}
//创建Callable接口子类的对象
CallableTask ct = new CallableTask(inte.get(indexNum));
FutureTask<String> future = new FutureTask<String>(ct);
//通过 ExecutorService 对象的 submit 方法执行任务
exs.submit(future);
//将任务执行结果存储到List中
resultList.add(future);
}
}
exs.shutdown();
for (FutureTask future : resultList) {
System.out.println(future.get());
}
}
}
实现callable
执行加点任务,每一个字母进来循环加51次点,加完结束任务
public class CallableTask implements Callable<String> {
private String s = "";
public CallableTask(String s) {
this.s = s;
}
//重写call方法
@Override
public String call() throws Exception {
String s1 = "";
for (int i = 0; i <= 50; i++) {
if(i==0){
s1 = s;
}
s1 += ".";
if(i==50){
System.out.println(s1+"结束");
}else{
System.out.println(s1);
}
}
return s1;
}
}
成功
运行结果ABCD四个字母每个字母后面加51个点



该博客记录了一个Java的demo,目的是用多线程处理List集合后返回结果集。使用win11、Idea2021.3.3和jdk1.8.0_131环境,将含ABCD的List分成三条线程执行,每个字母循环加51个点,最终成功实现预期结果。
626

被折叠的 条评论
为什么被折叠?



