1.背景
面试官问你知道多线程中join或Future的实现原理么?
2.代码
package com.ldp.demo01; import com.common.MyThreadUtil; import lombok.extern.slf4j.Slf4j; /** * @author 姿势帝-博客园 * @address https://www.cnblogs.com/newAndHui/ * @WeChat 851298348 * @create 01/30 6:11 * @description */ @Slf4j() public class Test06 { /** * 模拟发送短信异步获取结果 * 思考: * 1.有没有点像Future的感觉呢? * 2.大家可以去看看t1.join()的源码额; * 3.如果获取结果时设置一个超时响应了,应该怎么办????? * * @param args */ public static void main(String[] args) { GuardedObject<String> guardedObject = new GuardedObject<>(); Thread t1 = new Thread(() -> { log.info("短信发送中..."); // 模拟短信发送耗时3秒 MyThreadUtil.sleep(3); guardedObject.complete("短信发送成功"); }, "t1-发送短信"); t1.start(); log.info("结果获取中...."); // 获取短信发送结果 String result = guardedObject.get(); log.info("result=>" + result); } } /** * 中间对象 */ class GuardedObject<T> { private T t; private final Object lock = new Object(); /** * 获取结果 * * @return */ public T get() { synchronized (lock) { while (t == null) { // 等待 try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } return t; } } /** * 设置结果 * * @param t */ public void complete(T t) { synchronized (lock) { this.t = t; // 通知其他线程 lock.notifyAll(); } } }