一、多线程获取返回值
1、实现Callable接口(实现方式有两种)
(1)使用线程池
logger.info("001: " + new Date());
// 线程1在处理
ThreadTestService threadTestService = new ThreadTestService();
threadTestService.setNumber(10);
// 通过线程池实现线程
ExecutorService executorService = Executors.newFixedThreadPool(1);
Future< ThreadModel> future = executorService.submit(threadTestService);
// 线程2(主线程)在处理
int num1 = threadService.getNumber();
// 线程1处理完则获取数据,线程1处理中则阻塞
ThreadModel threadModel = future.get();
logger.info("003: " + new Date());
logger.info(String.valueOf(num1 + threadModel.getNum()));
ThreadTestService.java
public class ThreadTestService implements Callable< ThreadModel> {
private int number;
private Logger logger = LoggerFactory.getLogger(ThreadTestService.class);
@Override
public ThreadModel call() {
ThreadModel model = new ThreadModel();
try {
logger.info("threadTest start " + new Date());
Thread.sleep(10000);
logger.info("threadTest end " + new Date());
} catch (InterruptedException e) {
e.printStackTrace();
logger.error("error", e);
}
model.setNum(number);
return model;
}
public void setNumber(int number) {
this.number = number;
}
}
(2)使用FuntureTask
logger.info("001: " + new Date());
// 线程1在处理
ThreadTestService threadTestService = new ThreadTestService();
threadTestService.setNumber(10);
// 通过FutureTask实现线程
FutureTask< ThreadModel> futureTask = new FutureTask(threadTestService);
Thread thread = new Thread(futureTask);
thread.start();
// 线程2(主线程)在处理
int num1 = threadService.getNumber();
//线程1 获取数据(线程1处理完则获取数据,线程1处理中则阻塞)
ThreadModel threadModel = futureTask.get();
logger.info("003: " + new Date());
logger.info(String.valueOf(num1 + threadModel.getNum()));
2. 使用@Async注解
注:使用@Async注解,须在启动类加注解@EnableAsync
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableAsync
public class FinanceServerApplication {
public static void main(String[] args) {
SpringApplication.run(FinanceServerApplication.class, args);
}
}
logger.info("001: " + new Date());
// 线程1在处理
Future< ThreadModel> future =threadTestService.task(1);
// 线程2(主线程)在处理
int num1 = threadService.getNumber();
//线程1 获取数据(线程1处理完则获取数据,线程1处理中则阻塞)
ThreadModel threadModel = future.get();
logger.info("003: " + new Date());
logger.info(String.valueOf(num1 + threadModel.getNum()));
@Async注解的返回值为Future<>,需返回其实现类AsyncResult<>
@Service
public class ThreadTestService{
private Logger logger = LoggerFactory.getLogger(ThreadTestService.class);
@Async
public Future<ThreadModel> task(int number) {
ThreadModel model = new ThreadModel();
try {
logger.info("threadTest start " + new Date());
Thread.sleep(10000);
logger.info("threadTest end " + new Date());
} catch (InterruptedException e) {
e.printStackTrace();
logger.error("error", e);
}
model.setNum(number);
return new AsyncResult<>(model);
}
}