业务逻辑中需要使用多线程去分别执行不同的方法,然后将所有方法的返回结果进行合并,即并行调用若干方法,然后将若干方法各自的返回结果做下一步处理,比如:
sync1()
执行需要1s
sync2()
执行需要2s
sync3()
执行需要3s
那么代码将这3个方法并行执行后,结果应该>=3s
,实际肯定超过3s
项目启动类加上@EnableAsync
注解
业务逻辑类或具体方法加上@Async
注解
package xxx;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;
import java.util.concurrent.Future;
@Service
@Async
public class AsyncService {
public Future<String> sync1() throws InterruptedException {
Thread.sleep(1000);
return new AsyncResult<>("sync1");
}
public Future<String> sync2() throws InterruptedException {
Thread.sleep(2000);
return new AsyncResult<>("sync2");
}
public Future<String> sync3() throws InterruptedException {
Thread.sleep(3000);
return new AsyncResult<>("sync3");
}
}
package xxx;
import lombok.SneakyThrows;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.scheduling.annotation.Async;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
import java.util.stream.Collectors;
@SpringBootTest
public class AsyncTest {
@Autowired
private AsyncService asyncService;
@SneakyThrows
@Test
void test4(){
long start = System.currentTimeMillis();
Future<String> r1 = asyncService.sync1();
Future<String> r2 = asyncService.sync2();
Future<String> r3 = asyncService.sync3();
String rr1 = r1.get();
String rr2 = r2.get();
String rr3 = r3.get();
long end = System.currentTimeMillis();
System.out.println("耗时:"+(end-start));
System.out.println("r1="+rr1);
System.out.println("r2="+rr2);
System.out.println("r3="+rr3);
}
}
并行执行完3个方法后,每个方法的返回值需要
.get()
才能获取到,切记。