之前看视频上别人讲解java的Futrue功能可以提高系统运行效率,之后有一点疑惑,通过一个简单的例子了解Futrue到底好处在哪。
例子很简单,通过一个线程池来让子线程去执行任务,主线程打印一句话后调用futrue的get()方法。
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.concurrent.*;
@RunWith(SpringRunner.class)
@SpringBootTest(classes={MyTest.class})// 指定启动类
public class MyTest {
ThreadPoolExecutor pool = new ThreadPoolExecutor(5,10,30, TimeUnit.MINUTES,new ArrayBlockingQueue<Runnable>(10));
@Test
public void test() throws Exception {
MyTest myTest = new MyTest();
CallableThreads callableThreads = new CallableThreads();
Future<Integer> submit = myTest.pool.submit(callableThreads);
System.out.println("主线程让子线程执行费时操作了,自己又往下走了");
Thread.sleep(2000);
System.out.println("子线程返回值:"+submit.get());
System.out.println("主线程结束");
}
}
class CallableThreads implements Callable<Integer>{
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName());
Thread.sleep(5000);
return new Integer(1);
}
}
结果如图所示,主线程开启子线程后自己又向下执行,遇到submit后阻塞,直到子线程执行完毕返回结果。
去掉主线程中的:
结果直接结束,看来submit()是关键。
由此得知,Futrue提高系统执行效率 指的是发挥CPU的多核并发能力,对于并发低的情况并没有太大突出特点
实际中如果要用的话,我认为最好放到费时业务之前,或者将费时业务拆分成多个子业务,然后分别利用futrue开启,主线程只负责等他们全部执行完毕后返回结果。
但是对于前台要求快速返回结果的情况,也没必要非要用futrue,可以采取MQ那种方式进行异步执行异步同步数据,通过补偿机制解决潜在数据风险