当前位置: 首页 > news >正文

wordpress個人網站域名鞍山seo优化

wordpress個人網站域名,鞍山seo优化,做网站运营买什么电脑,外贸做独立网站怎么样美团本地生活面试:模拟外卖订单处理,客户支付提交订单后,查询订单详情,后台需要查询店铺备餐进度、以及外卖员目前位置信息后再返回。 时间好快,一转眼不到一个月时间,已经完成分享synchronized、volatile、…

美团本地生活面试:模拟外卖订单处理,客户支付提交订单后,查询订单详情,后台需要查询店铺备餐进度、以及外卖员目前位置信息后再返回。

时间好快,一转眼不到一个月时间,已经完成分享synchronized、volatile、CAS、AQS、ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier、并发锁、Condition、线程池、ThreadLocal等多个核心基础原理和案例剖析。

其实我编写文章速度真的很慢,基本每篇文章需要写2~3个小时去梳理。确保基础理论、源码分析、面试案例、优缺点等均分享到位,力求每篇都是干货实用,让每位看到我文章的同学,不管是面试、还是应用到工作实践,都能有所收益。

今天我们围绕Future是什么、怎么用,实践demo来展开分享,实现原理架构来展开。

一、Future是什么

首先我们回到一个问题,就是为什么需要Future、FutureTask?

之前我们用过的线程池ThreadPoolExecutor、线程Thread都可以执行异步任务,但是无法执行带有返回值的异步任务。而Future是可以执行这种带有返回值的异步任务。线程池ThreadPoolExecutor、Thread线程可以通过提交执行Future类型的任务,就可以获取任务返回值。

和Callable、Runnable一样,Future是一个接口。我们看一下它的接口源码。

//Runnable接口,只有一个run方法
@FunctionalInterface
public interface Runnable {public abstract void run();
}
//Callable接口,只有一个call方法
@FunctionalInterface
public interface Callable<V> {V call() throws Exception;
}

//本文主角Future有5个方法
public interface Future<V> {boolean cancel(boolean mayInterruptIfRunning);boolean isCancelled();boolean isDone();V get() throws InterruptedException, ExecutionException;V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException;
}

代码非常少,有5个方法,但是核心方法是get(),还是isDone();

get()方法:用来读取任务的返回结果。此外,如果任务未执行,调用该方法的当前线程会进入阻塞等待。

isDone()方法:检查计算是否已完成。这个方法不会阻塞线程。日常使用Future,一般是先调用isDone()方法判断结果是否返回,然后再调用get()方法获取执行结果。

一句话总结:Future是异步计算任务,提交Future任务后可以继续干别的;等干完别的事,再回来通过get()方法去读取Future任务结果

再简单总结:Future是支持在未来读取结果的异步计算任务。

cancel()方法:用来尝试取消任务,仅仅是尝试,不一定成功。如果任务已经开始执行,那么它就不能被取消。

isCancelled()方法:就是用来检查这个Future任务是否被取消。

Future和之前分享的信号量Semaphore、CountDownLatch倒数门闩、CyclicBarrier循环屏障都不一样,唯一和Condition条件队列有点像,支持多个线程协调进行。支持异步读取任务结果这个特性,Future可以很方便支持多个任务并发执行,以及在最后汇总获取并发结果,最后返回给终端。

二、应用实践:模拟同时查外卖信息

我们用FutureTask实现一个并发面试题:模拟外卖订单处理,客户支付提交订单后,查询订单详情,后台需要查询店铺备餐进度、以及外卖员目前位置信息后再返回。

package lading.java.mutithread;import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;/*** 模拟外卖订单处理,客户支付提交订单后,查询订单详情,后台* 通过查询店铺备餐进度、以及外卖员目前位置信息。*/
public class Demo015Future {public static void main(String[] args) throws ExecutionException, InterruptedException {//1、异步查询商家系统任务FutureTask<Boolean> checkFoodIsReadyTask = new FutureTask<>(() -> {System.out.println(Thread.currentThread().getName()+"转发请求到商家系统,查询餐厅当前订单备餐进度...");Thread.sleep(2000);boolean foodIsOk = true;System.out.println(Thread.currentThread().getName()+"商家接口返回是否备餐完成,结果是:" + foodIsOk);return foodIsOk;});//2、异步查询外卖员系统任务FutureTask<Boolean> checkCourierIsReadyTask = new FutureTask<>(() -> {System.out.println(Thread.currentThread().getName()+"转发请求到外卖员系统,查询外卖员是否已到店...");Thread.sleep(800);boolean courierIsOk = true;System.out.println(Thread.currentThread().getName()+"查询外卖员是否已到店,结果是:" + courierIsOk);return courierIsOk;});//并发查询商家、外卖员情况,大约2snew Thread(checkFoodIsReadyTask).start();new Thread(checkCourierIsReadyTask).start();Thread.sleep(100);//只是判断是否完成,不会阻塞if (!checkFoodIsReadyTask.isDone()) {System.out.println(Thread.currentThread().getName() + "查询店铺备餐进度未完成,继续等等...");}if (!checkCourierIsReadyTask.isDone()) {System.out.println(Thread.currentThread().getName() + "查询外卖员情况未完成,继续等等...");}//如果结果没返回会阻塞等待System.out.println(Thread.currentThread().getName() + "线程 成功查到商家备餐结果:" + checkFoodIsReadyTask.get());System.out.println(Thread.currentThread().getName() + "线程 成功查到外卖员结果:" + checkCourierIsReadyTask.get());}
}

运行结果:

三、硬核干活:FutureTask的实现原理源码分析

我们从它的属性开始,然后讲实现的方法原理。

3.1 FutureTask的属性

FutureTask 的源码也不多,属性就这5个。

线程状态state、执行任务的callable,任务执行的返回结果outCome,正在运行的线程runner,等待队列里的waiters节点。

3.1.1 当前任务线程状态state,以及状态枚举

这七种任务状态之间相互转换关系:

1、正常结束

NEW -> COMPLETING -> NORMAL

2、异常结束

NEW -> COMPLETING -> EXCEPTIONAL

3、任务被取消

NEW -> CANCELLED

4、任务出现中断

NEW -> INTERRUPTING -> INTERRUPTED

//当前任务线程的状态,以下几个枚举值都是state不同状态
private volatile int state;//当前任务线程刚创建状态
private static final int NEW          = 0;
//当前任务线程即将完成,ing是一个即将完成状态
private static final int COMPLETING   = 1;
//表示当前任务线程正常结束的状态
private static final int NORMAL       = 2;
//表示当前任务线程有异常
private static final int EXCEPTIONAL  = 3;
//表示当前任务线程被取消
private static final int CANCELLED    = 4;
//表示当前线程已经被打了中断标识
private static final int INTERRUPTING = 5;
//表示当前线程已经被中断
private static final int INTERRUPTED  = 6;
3.2 其他属性意义
//Callable 来执行任务,Callable 有返回值的线程
private Callable<V> callable;//Callable任务执行的返回结果
private Object outcome; //当前正在运行的线程
private volatile Thread runner;//等待队列节点,WaitNode是FutureTask的内部类
private volatile WaitNode waiters;

waiters等待队列:这个是单向队列,里面是等待本任务执行结果的线程。比如ABCD四个线程,其中A线程执行了任务,B、C、D线程,都等A线程的返回结果,就需要在waiters等待队列里等着。

//等待队列源码static final class WaitNode {//被阻塞的线程,也就volatile Thread thread;//这里看出它就是个单向队列volatile WaitNode next;WaitNode() { thread = Thread.currentThread(); }}
3.3 run()方法原理

run方法比较简单,不放源码,直接说,就是执行定义的callable任务,任务执行完成后,通过CAS去更新outCome返回值。

    protected void set(V v) {if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) {outcome = v;UNSAFE.putOrderedInt(this, stateOffset, NORMAL); // final statefinishCompletion();}}

3.4 get()方法原理

这个方法和run()一样重要,其他线程想要获取本任务结果,都是通过get方法读取。逻辑也是很简单。其中waitDone()方法,就是进入等待等列等结果。

    public V get() throws InterruptedException, ExecutionException {int s = state;//1、如果任务没执行完成,当前想读取任务结果的线程就进入阻塞等待if (s <= COMPLETING)s = awaitDone(false, 0L);//2、如果任务执行完成,就返回结果    return report(s);}
3.5 其他方法
    //当前任务状态是否被取消,直接读状态值public boolean isCancelled() {return state >= CANCELLED;}//当前任务状态是否以及执行结束,直接读状态值public boolean isDone() {return state != NEW;}

本系列文章推荐:

1、JAVA并发编程系列(12)ThreadLocal就是这么简单|建议收藏

2、JAVA并发编程系列(11)线程池底层原理架构剖析


文章转载自:
http://innumerably.hwbf.cn
http://interior.hwbf.cn
http://undermost.hwbf.cn
http://forepost.hwbf.cn
http://hooded.hwbf.cn
http://ichthyomorphic.hwbf.cn
http://mantuan.hwbf.cn
http://imprescriptible.hwbf.cn
http://nizamate.hwbf.cn
http://naturist.hwbf.cn
http://sweaty.hwbf.cn
http://tuesday.hwbf.cn
http://ntsc.hwbf.cn
http://hebraic.hwbf.cn
http://interdiffuse.hwbf.cn
http://underactivity.hwbf.cn
http://lavishly.hwbf.cn
http://turnhalle.hwbf.cn
http://weighbeam.hwbf.cn
http://waterworks.hwbf.cn
http://stratigrapher.hwbf.cn
http://stupend.hwbf.cn
http://californicate.hwbf.cn
http://unminded.hwbf.cn
http://epithelium.hwbf.cn
http://chiv.hwbf.cn
http://nihilist.hwbf.cn
http://orrin.hwbf.cn
http://boxboard.hwbf.cn
http://savey.hwbf.cn
http://homiletics.hwbf.cn
http://napoleonic.hwbf.cn
http://blackly.hwbf.cn
http://duoplasmatron.hwbf.cn
http://palingenist.hwbf.cn
http://magistracy.hwbf.cn
http://selvagee.hwbf.cn
http://thyme.hwbf.cn
http://richina.hwbf.cn
http://conicoid.hwbf.cn
http://labe.hwbf.cn
http://hydrops.hwbf.cn
http://craftswoman.hwbf.cn
http://culturalize.hwbf.cn
http://wickmanite.hwbf.cn
http://elva.hwbf.cn
http://surveillance.hwbf.cn
http://edacity.hwbf.cn
http://virginhood.hwbf.cn
http://eucalyptol.hwbf.cn
http://flesh.hwbf.cn
http://nuthook.hwbf.cn
http://hopbine.hwbf.cn
http://unmown.hwbf.cn
http://grabber.hwbf.cn
http://biflagellate.hwbf.cn
http://vindicable.hwbf.cn
http://account.hwbf.cn
http://cpo.hwbf.cn
http://summerhouse.hwbf.cn
http://homostylous.hwbf.cn
http://utterly.hwbf.cn
http://sabayon.hwbf.cn
http://bikeway.hwbf.cn
http://outgrowth.hwbf.cn
http://fusion.hwbf.cn
http://dactylus.hwbf.cn
http://pittosporum.hwbf.cn
http://mayo.hwbf.cn
http://biotypology.hwbf.cn
http://domicile.hwbf.cn
http://sumptuary.hwbf.cn
http://whimmy.hwbf.cn
http://sweeting.hwbf.cn
http://jacquerie.hwbf.cn
http://akee.hwbf.cn
http://underwrought.hwbf.cn
http://beneficence.hwbf.cn
http://aroynt.hwbf.cn
http://jura.hwbf.cn
http://boccie.hwbf.cn
http://aviculture.hwbf.cn
http://varicocelectomy.hwbf.cn
http://gower.hwbf.cn
http://blende.hwbf.cn
http://questioningly.hwbf.cn
http://westering.hwbf.cn
http://paperwhite.hwbf.cn
http://commoner.hwbf.cn
http://nappy.hwbf.cn
http://spontaneously.hwbf.cn
http://stoolball.hwbf.cn
http://pecksniffian.hwbf.cn
http://amesace.hwbf.cn
http://neuropsychiatry.hwbf.cn
http://idealism.hwbf.cn
http://procuress.hwbf.cn
http://topsoil.hwbf.cn
http://indemnificatory.hwbf.cn
http://quinquagesima.hwbf.cn
http://www.15wanjia.com/news/61834.html

相关文章:

  • excel做网站页面布局查询网 域名查询
  • 网店设计教程一键优化下载
  • 用别人备案域名做违法网站网站备案查询系统
  • 删除wordpress网页无用牡丹江seo
  • wordpress获取主题路径免费seo教程资源
  • 在线制作网页系统seo外链发布技巧
  • 特乐网站建设西安网站推广
  • 假网站怎么做网站的seo方案
  • 网站网站制作服务找广告商的平台
  • 深圳做营销网站公司哪家好聊城网站seo
  • 公司的网站设计网站外链代发
  • 网站图片少影响seo吗个人网站开发网
  • 如何做镜框 网站html网页制作模板
  • 凡科快图入口河北seo推广
  • wordpress网站转app插件下载湖南有实力seo优化哪家好
  • 建设网站要点西安seo培训机构
  • 长沙网站建设王道下拉惠桂林网站设计
  • 做的比较好的时尚网站国内搜索引擎网站
  • 网站怎么下载视频外贸软件排行榜
  • 厦门专业网站建设优化新十条
  • 网站建设维护日记百度网盘app官网
  • 香港做网站公司哈尔滨网站制作软件
  • 织梦网站栏目访问目录对网站和网页的认识
  • 安康市建设规划局网站图片外链
  • 网站建设应对客户问题的话术潍坊seo计费
  • 做移动网站开发目前引流最好的app
  • 深圳app设计网站建设深圳百度竞价推广
  • 服装批发一手货源网冯耀宗seo课程
  • 网址导航2345苏州seo服务热线
  • 商城网站建设计划书简述网络营销的含义