• 多线程中的“回调”


    回调:类A的a()方法调用类B的b()方法;类B的b()方法执行完毕主动调用类A的callback()方法,这是一种双向调用的方式。

    这里其实不是本质意义上的回调,这里是调用者主动调用get方法阻塞获取返回值。

    package com.xsl.test;
    
    import java.util.Random;
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    import java.util.concurrent.FutureTask;
    import java.util.concurrent.TimeUnit;
    
    import org.junit.Test;
    
    public class 多线程中的回调 {
        // 回调获取返回值
        @Test
        public void test () {
            try {
                /**
                 * 方式一:Executors+Future方式
                 */
                ExecutorService executor = Executors.newCachedThreadPool();
                Future<String> future = executor.submit(new Callable<String>() {
                    @Override
                    public String call() throws Exception {
                        System.out.println("call");
                        TimeUnit.SECONDS.sleep(1);
                        return "str";
                    }
                });
                // 手动阻塞调用get通过call方法获得返回值。
                System.out.println(future.get());
                // 需要手动关闭,不然线程池的线程会继续执行。
                executor.shutdown();
                
                /**
                 * 方式二:FutureTask+Thread方式
                 */
                // 使用futuretask同时作为线程执行单元和数据请求单元。
                FutureTask<Integer> futureTask = new FutureTask<Integer>(new Callable<Integer>() {
                    @Override
                    public Integer call() throws Exception {
                        System.out.println("hello");
                        return new Random().nextInt();
                    }
                });
                new Thread(futureTask).start();
                // 阻塞获取返回值
                System.out.println(futureTask.get());
                
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    }

    返回结果如下:

    call
    str
    hello
    575489680

  • 相关阅读:
    OOP & Pointer: Segment Tree
    ICPC_2020 上海站
    Notes: Kirchhoff's Matrix 基尔霍夫矩阵
    CS61A Homework: Church Numerals
    题解:[COCI2011-2012#5] BLOKOVI
    题解:SDOI2017 新生舞会
    题解:POI2012 Salaries
    题解:洛谷P1357 花园
    题解:CF593D Happy Tree Party
    题解 P2320 【[HNOI2006]鬼谷子的钱袋】
  • 原文地址:https://www.cnblogs.com/xsl1995/p/10519443.html
Copyright © 2020-2023  润新知