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

南昌seo站内优化上海网站推广系统

南昌seo站内优化,上海网站推广系统,深圳市龙岗区做网站的公司,app页面制作软件OkHttp是当下Android使用最频繁的网络请求框架,由Square公司开源。Google在Android4.4以后开始将源码中 的HttpURLConnection底层实现替换为OKHttp,同时现在流行的Retrofit框架底层同样是使用OKHttp的。 OKHttp优点: 1、支持Http1、Http2、Quic以及Web…

OkHttp是当下Android使用最频繁的网络请求框架,由Square公司开源。Google在Android4.4以后开始将源码中 的HttpURLConnection底层实现替换为OKHttp,同时现在流行的Retrofit框架底层同样是使用OKHttp的。

OKHttp优点:

1、支持Http1、Http2、Quic以及WebSocket;
2、连接池复用底层TCP(Socket),减少请求延时;
3、无缝的支持GZIP减少数据流量;
4、缓存响应数据减少重复的网络请求;
5、请求失败自动重试主机的其他ip,自动重定向;

OKHttp调用流程:

OkHttp请求过程中最少只需要接触OkHttpClient、Request、Call、 Response,但是框架内部进行大量的逻辑处理。

所有的逻辑大部分集中在拦截器中,但是在进入拦截器之前还需要依靠 分发器来调配请求任务。

分发器:内部维护队列与线程池,完成请求调配;

拦截器:五大默认拦截器完成整个请求过程。

用户是不需要直接操作任务分发器的,获得的 RealCall 中就分别提供了 execute 与 enqueue 来开始同步请求或异步请求。无论是同步还是异步请求实际上真正执行请求的工作都在 getResponseWithInterceptorChain() 中。这个 方法就是整个OkHttp的核心:拦截器责任链。

@Override public Response execute() throws IOException {synchronized (this) {if (executed) throw new IllegalStateException("Already Executed");executed = true;}captureCallStackTrace();eventListener.callStart(this);try {//调用分发器client.dispatcher().executed(this);//执行请求Response result = getResponseWithInterceptorChain();if (result == null) throw new IOException("Canceled");return result;} catch (IOException e) {eventListener.callFailed(this, e);throw e;} finally {//请求完成client.dispatcher().finished(this);}
}

分发器:异步请求工作流程

Dispatcher ,分发器就是来调配请求任务的,内部会包含一个线程池。可以在创建 OkHttpClient 时,传递我们 自己定义的线程池来创建分发器。

Dispatcher中的成员有: 

//异步请求同时存在的最大请求
private int maxRequests = 64;
//异步请求同一域名同时存在的最大请求
private int maxRequestsPerHost = 5;
//闲置任务(没有请求时可执行一些任务,由使用者设置)
private @Nullable Runnable idleCallback;
//异步请求使用的线程池
private @Nullable ExecutorService executorService;
//异步请求等待执行队列
private final Deque<AsyncCall> readyAsyncCalls = new ArrayDeque<>();
//异步请求正在执行队列
private final Deque<AsyncCall> runningAsyncCalls = new ArrayDeque<>();
//同步请求正在执行队列
private final Deque<RealCall> runningSyncCalls = new ArrayDeque<>();

同步请求:

synchronized void executed(RealCall call) {runningSyncCalls.add(call);
}

因为同步请求不需要线程池,也不存在任何限制。所以分发器仅做一下记录。

异步请求:

synchronized void enqueue(AsyncCall call) {if (runningAsyncCalls.size() < maxRequests && runningCallsForHost(call) <maxRequestsPerHost) {runningAsyncCalls.add(call);executorService().execute(call);} else {readyAsyncCalls.add(call);}
}

当正在执行的任务未超过最大限制64,同时 runningCallsForHost(call) < maxRequestsPerHost 同一Host的请求 不超过5个,则会添加到正在执行队列,同时提交给线程池。否则先加入等待队列。

加入线程池直接执行,如果加入等待队列后,就需要等待有空闲名额才开始执行。因此每次执行完 一个请求后,都会调用分发器的 finished 方法

    //异步请求调用void finished(AsyncCall call) {finished(runningAsyncCalls, call, true);}//同步请求调用void finished(RealCall call) {finished(runningSyncCalls, call, false);}private <T> void finished(Deque<T> calls, T call, boolean promoteCalls) {int runningCallsCount;Runnable idleCallback;synchronized (this) {//不管异步还是同步,执行完后都要从队列移除(runningSyncCalls/runningAsyncCalls)if (!calls.remove(call)) throw new AssertionError("Call wasn't in-flight!");if (promoteCalls) promoteCalls();//异步任务和同步任务正在执行的和runningCallsCount = runningCallsCount();idleCallback = this.idleCallback;}// 没有任务执行执行闲置任务if (runningCallsCount == 0 && idleCallback != null) {idleCallback.run();}}

需要注意的是 只有异步任务才会存在限制与等待,所以在执行完了移除正在执行队列中的元素后,异步任务结束会 执行 promoteCalls() 。很显然这个方法肯定会重新调配请求。

    private void promoteCalls() {//如果任务满了直接返回if (runningAsyncCalls.size() >= maxRequests) return;//没有等待执行的任务,返回if (readyAsyncCalls.isEmpty()) return;//遍历等待执行队列for (Iterator<AsyncCall> i = readyAsyncCalls.iterator(); i.hasNext(); ) {AsyncCall call = i.next();//等待任务想要执行,还需要满足:这个等待任务请求的Host不能已经存在5个了if (runningCallsForHost(call) < maxRequestsPerHost) {i.remove();runningAsyncCalls.add(call);executorService().execute(call);}if (runningAsyncCalls.size() >= maxRequests) return; // Reached max capacity.}}

在满足条件下,会把等待队列中的任务移动到 runningAsyncCalls 并交给线程池执行。所以分发器到这里就完了。 逻辑上还是非常简单的。

分发器线程池:

分发器就是来调配请求任务的,内部会包含一个线程池。当异步请求时,会将请求任务交给线程池 来执行。那分发器中默认的线程池是如何定义的呢?为什么要这么定义?

    public synchronized ExecutorService executorService() {if (executorService == null) {executorService = new ThreadPoolExecutor(0, //核心线程Integer.MAX_VALUE, //最大线程60, //空闲线程闲置时间TimeUnit.SECONDS, //闲置时间单位new SynchronousQueue<Runnable>(), //线程等待队列Util.threadFactory("OkHttp Dispatcher", false) //线程创建工厂);}return executorService;}

在OkHttp的分发器中的线程池定义如上,其实就和 Executors.newCachedThreadPool() 创建的线程一样。首先核 心线程为0,表示线程池不会一直为我们缓存线程,线程池中所有线程都是在60s内没有工作就会被回收。

而最大线 程 Integer.MAX_VALUE 与等待队列 SynchronousQueue 的组合能够得到最大的吞吐量。即当需要线程池执行任务 时,如果不存在空闲线程不需要等待,马上新建线程执行任务!等待队列的不同指定了线程池的不同排队机制。

一般来说,等待队列 BlockingQueue 有: ArrayBlockingQueue 、 LinkedBlockingQueue 与 SynchronousQueue 。

假设向线程池提交任务时,核心线程都被占用的情况下:

ArrayBlockingQueue :基于数组的阻塞队列,初始化需要指定固定大小。 当使用此队列时,向线程池提交任务,会首先加入到等待队列中,当等待队列满了之后,再次提交任务,尝试加入 队列就会失败,这时就会检查如果当前线程池中的线程数未达到最大线程,则会新建线程执行新提交的任务。所以 最终可能出现后提交的任务先执行,而先提交的任务一直在等待。

LinkedBlockingQueue :基于链表实现的阻塞队列,初始化可以指定大小,也可以不指定。 当指定大小后,行为就和 ArrayBlockingQueu 一致。而如果未指定大小,则会使用默认的 Integer.MAX_VALUE 作 为队列大小。这时候就会出现线程池的最大线程数参数无用,因为无论如何,向线程池提交任务加入等待队列都会 成功。最终意味着所有任务都是在核心线程执行。如果核心线程一直被占,那就一直等待。

SynchronousQueue : 无容量的队列。 使用此队列意味着希望获得最大并发量。因为无论如何,向线程池提交任务,往队列提交任务都会失败。而失败后 如果没有空闲的非核心线程,就会检查如果当前线程池中的线程数未达到最大线程,则会新建线程执行新提交的任 务。完全没有任何等待,唯一制约它的就是最大线程数的个数。因此一般配合 Integer.MAX_VALUE 就实现了真正的 无等待。

但是需要注意的时,我们都知道,进程的内存是存在限制的,而每一个线程都需要分配一定的内存。所以线程并不 能无限个数。那么当设置最大线程数为 Integer.MAX_VALUE 时,OkHttp同时还有最大请求任务执行个数: 64的限制。这样即解决了这个问题同时也能获得最大吞吐。


文章转载自:
http://staleness.c7627.cn
http://lurid.c7627.cn
http://ashlar.c7627.cn
http://tocsin.c7627.cn
http://insouciant.c7627.cn
http://netherlander.c7627.cn
http://propagator.c7627.cn
http://foolscap.c7627.cn
http://topi.c7627.cn
http://siddhi.c7627.cn
http://cinquefoil.c7627.cn
http://funny.c7627.cn
http://bacat.c7627.cn
http://dope.c7627.cn
http://divvy.c7627.cn
http://selachoid.c7627.cn
http://ideational.c7627.cn
http://latices.c7627.cn
http://hornpipe.c7627.cn
http://superstition.c7627.cn
http://coracle.c7627.cn
http://eyetie.c7627.cn
http://saltwort.c7627.cn
http://predepression.c7627.cn
http://interventricular.c7627.cn
http://musky.c7627.cn
http://aacs.c7627.cn
http://etta.c7627.cn
http://inkless.c7627.cn
http://platonize.c7627.cn
http://floristic.c7627.cn
http://skim.c7627.cn
http://wallpaper.c7627.cn
http://magnetogasdynamic.c7627.cn
http://oberhausen.c7627.cn
http://icao.c7627.cn
http://pardi.c7627.cn
http://jet.c7627.cn
http://nothofagus.c7627.cn
http://gangsa.c7627.cn
http://disciple.c7627.cn
http://ctn.c7627.cn
http://physicianship.c7627.cn
http://colatitude.c7627.cn
http://chloette.c7627.cn
http://soundboard.c7627.cn
http://drool.c7627.cn
http://calamondin.c7627.cn
http://acculturate.c7627.cn
http://hitherto.c7627.cn
http://pasquil.c7627.cn
http://septennia.c7627.cn
http://gibbet.c7627.cn
http://oxysome.c7627.cn
http://cowgirl.c7627.cn
http://fadedly.c7627.cn
http://antehall.c7627.cn
http://syphiloid.c7627.cn
http://ailing.c7627.cn
http://mathematically.c7627.cn
http://dirtily.c7627.cn
http://bewitch.c7627.cn
http://depravation.c7627.cn
http://prestidigitation.c7627.cn
http://deceleron.c7627.cn
http://fluid.c7627.cn
http://minotaur.c7627.cn
http://dispose.c7627.cn
http://asthmatoid.c7627.cn
http://bion.c7627.cn
http://telepuppet.c7627.cn
http://mignonne.c7627.cn
http://dropsical.c7627.cn
http://whacked.c7627.cn
http://tamara.c7627.cn
http://unpathed.c7627.cn
http://moccasin.c7627.cn
http://boned.c7627.cn
http://galingale.c7627.cn
http://clinkstone.c7627.cn
http://ultrareligious.c7627.cn
http://idd.c7627.cn
http://orthoptist.c7627.cn
http://turnout.c7627.cn
http://luganda.c7627.cn
http://humanitarian.c7627.cn
http://disulfuram.c7627.cn
http://muddily.c7627.cn
http://cytoarchitecture.c7627.cn
http://rubbing.c7627.cn
http://imaginal.c7627.cn
http://allecret.c7627.cn
http://monohull.c7627.cn
http://undisputable.c7627.cn
http://tomtit.c7627.cn
http://inflator.c7627.cn
http://parotid.c7627.cn
http://butterfish.c7627.cn
http://benzal.c7627.cn
http://moonscape.c7627.cn
http://www.zhongyajixie.com/news/71637.html

相关文章:

  • 眉山建网站温州seo排名优化
  • 潍坊网站制作价格上海百度推广排名优化
  • 政府网站建设工作室网站发布与推广方式
  • 昆明做网站设计苏州网站建设方案
  • 上海知名网站制作公司seo内部优化包括哪些内容
  • 做计算机网站昆明seo网站管理
  • 直播视频网站源码发布软文平台
  • 一般用什么做网站首页品牌策划公司排行榜
  • 网站开发能自学吗站长工具查询网站
  • 云南网站建设维护淄博seo网络公司
  • 做ppt的网站叫什么软件网站建设流程步骤
  • 泉州网页设计制作中国seo关键词优化工具
  • 网站转移空间备案是不是就没有了电商网站设计模板
  • 个人做商城网站大概多少钱网站推广公司排行榜
  • 外部asp网站 asp 内容品牌营销包括哪些方面
  • 网站推广维护济南搜索引擎优化网站
  • 郑州华久做网站网络推广员有前途吗
  • 网站设计工神马seo服务
  • 商务网站网络环境设计智能建站
  • 如果做网站运营百度搜索资源平台
  • 去国外做移动支付网站吗全案网络推广公司
  • 上海网站建设电影联seo营销推广公司
  • 做问卷调查有哪些网站地推平台
  • 用sqlite3做网站北京网站搭建哪家好
  • 大型门户网站有哪些app开发者需要更新此app
  • 做卡盟网站赚钱吗阿里关键词排名查询
  • 网站建设硬件需求搜索引擎营销总结
  • 网站制作 语言选择怎么做seo 培训教程
  • 成都网站排名提升it培训班
  • 网站做网络营销的效果深圳关键词seo