准备面试总结下
1.CompletableFuture
- static ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(10, 20, 1000L, TimeUnit.MICROSECONDS, new ArrayBlockingQueue<>(100));
-
- public static void main(String[] args) throws ExecutionException, InterruptedException {
- CompletableFuture
task1 = CompletableFuture.supplyAsync(() -> { - try {
- System.out.println("task1");
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- return 1000;
- }, poolExecutor);
-
- CompletableFuture
task2 = CompletableFuture.supplyAsync(() -> { - try {
- System.out.println("task2");
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- return 2000;
- }, poolExecutor);
-
-
- CompletableFuture
task3 = CompletableFuture.supplyAsync(() -> { - try {
- System.out.println("task3");
- Thread.sleep(10000);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- return 5000;
- }, poolExecutor);
- Integer result1 = task1.get();
- System.out.println(result1);
- Integer result2 = task2.get();
- System.out.println(result2);
- Integer result3 = task3.get();
- System.out.println(result3);
- CompletableFuture
voidCompletableFuture = CompletableFuture.allOf(task1, task2, task3); - poolExecutor.shutdown();
- System.out.println("执行完毕");
-
- }
2.CoutDownLatch
- static HashMap
map = new HashMap(); -
- public static void main(String[] args) throws InterruptedException, ExecutionException {
- ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(10, 20, 1000L, TimeUnit.MICROSECONDS, new ArrayBlockingQueue<>(100));
- CountDownLatch countDownLatch = new CountDownLatch(3);
-
-
- Future
task1 = poolExecutor.submit(new Callable() { - @Override
- public Integer call() throws Exception {
- System.out.println("任务1");
- Thread.sleep(1000);
- System.out.println("任务1结束");
- countDownLatch.countDown();
- return 1000;
- }
- });
-
- Future
task2 = poolExecutor.submit(new Callable() { - @Override
- public Integer call() throws Exception {
- System.out.println("任务2");
- Thread.sleep(500);
- System.out.println("任务2结束");
- countDownLatch.countDown();
- return 500;
- }
- });
-
- Future
task3 = poolExecutor.submit(new Callable() { - @Override
- public Integer call() throws Exception {
- System.out.println("任务3");
- Thread.sleep(2000);
- System.out.println("任务3结束");
- countDownLatch.countDown();
- return 2000;
- }
- });
- map.put("task1", task1.get());
- map.put("task2", task1.get());
- map.put("task3", task1.get());
-
-
- System.out.println("线程跑完了");
- countDownLatch.await();
- System.out.println("---------------任务执行结束-------------");
- poolExecutor.shutdown();
-
- }
3.阻塞获取异步调用结果
- public static void main(String[] args) throws ExecutionException, InterruptedException {
- ExecutorService executorService = Executors.newFixedThreadPool(3);
- Future
submit = executorService.submit(new Callable() { - @Override
- public String call() throws Exception {
- Thread.sleep(1000);
- return "Its done";
- }
- });
- while (true){
- if (submit.isDone()){
- System.out.println(submit.get());
- break;
- }
- System.out.println(submit.isDone());
-
- }
- }
4.除了上面两个方法 还有 CyclicBarrier,Semaphore也都可以实现,可以自己尝试下