1、场景
有多个的方法,在串行执行的时候效率比较慢,在保证方法不相互依赖的情况下想要提高效率就需要并行执行
2、通义灵码开始工作
根据场景总结相关问题并咨询同义灵码,如:帮我写一个多个方法可并行执行并返回对应数据的工具类
3、通义灵码返回
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
import java.util.stream.Collectors;
public class MultiThreadTaskExecutor {
private final ExecutorService executor;
public MultiThreadTaskExecutor(int threadCount) {
this.executor = Executors.newFixedThreadPool(threadCount);
}
/**
* 并行执行多个方法并返回它们的结果。
*
* @param tasks 方法列表,每个方法都封装在Callable中
* @return 一个Future数组,包含所有方法的返回结果
*/
public <T> List<Future<T>> executeParallel(List<? extends Callable<T>> tasks) throws InterruptedException {
return executor.invokeAll(tasks);
}
/**
* 关闭executor服务
*/
public void shutdown() {
executor.shutdown();
}
/**
* 执行一组动态方法(表示为Callable),并收集结果。
* @param callables 可调用对象列表,每个对象代表一个动态方法
* @param <T> 方法返回值的泛型
* @return 包含所有方法执行结果的列表
*/
public <T> List<T> executeParallelDynamicMethods(List<Callable<T>> callables) {
List<CompletableFuture<T>> futures = new ArrayList<>();
for (Callable<T> callable : callables) {
CompletableFuture<T> future = CompletableFuture.supplyAsync(() ->
{
try {
return callable.call();
} catch (Exception e) {
System.out.println("supplyAsync, 运行异常:" + e.getMessage());
}
return null;
}
, executor);
futures.add(future);
}
// 等待所有任务完成
CompletableFuture<Void> allDoneFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
try {
allDoneFuture.get(); // 这里会阻塞直到所有任务完成
} catch (InterruptedException | ExecutionException e) {
System.out.println("executeParallelDynamicMethods, 运行异常:" + e.getMessage());
}
// 收集所有结果
List<T> resultList = futures.stream().map(CompletableFuture::join).collect(Collectors.toList());
// 关闭线程
this.shutdown();
return resultList;
}
4、调用测试
import org.junit.Test;
import java.util.*;
import java.util.concurrent.Callable;
public class methodTest {
public Integer timeConsumingMethod1() {
long startTime= System.currentTimeMillis();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime= System.currentTimeMillis();
return (int) ((endTime-startTime)/1000);
}
public Integer timeConsumingMethod2() {
long startTime= System.currentTimeMillis();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime= System.currentTimeMillis();
return (int) ((endTime-startTime)/1000);
}
public Integer timeConsumingMethod3() {
long startTime= System.currentTimeMillis();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime= System.currentTimeMillis();
return (int) ((endTime-startTime)/1000);
}
public Integer timeConsumingMethod4() {
long startTime= System.currentTimeMillis();
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime= System.currentTimeMillis();
return (int) ((endTime-startTime)/1000);
}
@Test
public void parallelTest() {
long startTime= System.currentTimeMillis();
MultiThreadTaskExecutor executor = new MultiThreadTaskExecutor(4);
List<Callable<Object>> callables = new ArrayList<>();
callables.add(() -> timeConsumingMethod1());
callables.add(() -> timeConsumingMethod2());
callables.add(() -> timeConsumingMethod3());
callables.add(() -> timeConsumingMethod4());
List<Object> futures = executor.executeParallelDynamicMethods(callables);
long endTime= System.currentTimeMillis();
System.out.println("并行耗时:"+ ((endTime-startTime)/1000));
}
@Test
public void serialTest() {
long startTime= System.currentTimeMillis();
timeConsumingMethod1();
timeConsumingMethod2();
timeConsumingMethod3();
timeConsumingMethod4();
long endTime= System.currentTimeMillis();
System.out.println("串行耗时:"+ ((endTime-startTime)/1000));
}
serialTest()运行结果
串行耗时:12
parallelTest()运行结果
并行耗时:4
5.总结
根据通义灵码提供的多线程方法测试发现,效率明显有很大提升,根据代码水平你们说一下目前的通义灵码处于什么水平呢?