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

多终端网站开发北京搜索引擎推广服务

多终端网站开发,北京搜索引擎推广服务,网页模板的制作步骤,小俊哥网站建设文章目录 6 任务执行6.1 在线程中执行任务6.1.1 串行地执行任务6.1.2 显式地为任务创建线程6.1.3 无限制创建线程的不足 6.2 Executor框架6.2.1 示例#xff1a;基于Executor的Web服务器6.2.2 执行策略6.2.3 线程池6.2.4 Executor的生命周期6.2.5 延迟任务与周期任务 6.3 找出… 文章目录 6 任务执行6.1 在线程中执行任务6.1.1 串行地执行任务6.1.2 显式地为任务创建线程6.1.3 无限制创建线程的不足 6.2 Executor框架6.2.1 示例基于Executor的Web服务器6.2.2 执行策略6.2.3 线程池6.2.4 Executor的生命周期6.2.5 延迟任务与周期任务 6.3 找出可利用的并行性6.3.1 示例串行的页面渲染器6.3.2 携带结果的任务Callable和Future6.3.3 示例使用Future实现页面渲染器6.3.4 在异构任务并行化中存在的局限6.3.5 CompletionServiceExecutor与BlockingQueue6.3.6 使用CompletionService实现页面渲染器6.3.7 为任务设置时间6.3.8 示例旅行预订门户网站 6 任务执行 6.1 在线程中执行任务 应选择清晰的任务边界以及明确的任务执行策略。 一种自然的任务边界选择方式以独立的客户请求为边界。 6.1.1 串行地执行任务 6.1.2 显式地为任务创建线程 程序6-1-2-1 在Web服务器中为每一个请求启动一个新的线程不要这么做 class ThreadPerTaskWebServer {public static void main(String[] args) throws IOException {ServerSocket socket new ServerSocket(80);while (true) {final Socket connection socket.accept();Runnable task new Runnable() {Overridepublic void run() {handleRequest(connection);}};new Thread(task).start();}} }串行情况下可以提升性能。只要请求的到达速率不超出服务器的请求处理能力。 6.1.3 无限制创建线程的不足 线程生命周期的开销非常高。 线程创建需要时间延迟处理的请求并且需要JVM和操作系统提供一些辅助操作。 资源消耗。 活跃线程会消耗系统资源尤其是内存。大量空闲的线程会占用许多内存给垃圾收集器带来压力而且大量线程在竞争CPU资源时还会产生其他的性能开销。如果有足够多的线程使所有的CPU保持忙碌状态那么再创建更多的线程反而会降低性能。 稳定性。 在一定范围内增加线程可以提高系统的吞吐率但是如果超出了这个范围再创建更多的线程会降低程序的执行速度。如果过多地创建一个线程那么整个应用程序将崩溃。 6.2 Executor框架 Executor基于生产者-消费者模式提交任务的操作相当于生产者生成待完成的工作单元执行任务的线程相当于消费者执行完这些工作单元。 6.2.1 示例基于Executor的Web服务器 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.Executor; import java.util.concurrent.Executors;class TaskExecutionWebServer {private static final int NTHREADS 100;private static final Executor exec Executors.newFixedThreadPool(NTHREADS);public static void main(String[] args) throws IOException {ServerSocket socket new ServerSocket(80);while (true) {final Socket connection socket.accept();Runnable task new Runnable() {Overridepublic void run() {handleRequest(connection);}};exec.execute(task);}} }6.2.2 执行策略 使用线程池来取代new Thread方式。 6.2.3 线程池 newFixedThreadPool。固定长度的线程池。newCachedThreadPool。如果线程池的当前规模超过了处理需求时那么将回收空闲的线程而当需求增加时则可以添加新的线程线程池的规模不存在任何限制。newSingleThreadExecutor。创建单个工作线程来执行任务如果这个线程异常结束会创建另一个线程来替代。newScheduledThreadPool。固定长度的线程池。以延迟或者定时的方式来执行任务。 6.2.4 Executor的生命周期 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.RejectedExecutionException;public class LifeCycleWebServer {private final ExecutorService exec ...;public void start() throws IOException {ServerSocket socket new ServerSocket(80);while (!exec.isShutdown()) {try {final Socket conn socket.accept();exec.execute(new Runnable() {Overridepublic void run() {handleRequest(conn);}});} catch (RejectedExecutionException e) {if (!exec.isShutdown()) {log(task submission rejected, e);}}}}public void stop() {exec.shutdown();}void handleRequest(Socket connection) {Request req readRequest(connection);if (isShutdownRequest(req)) {stop();} else {dispatchRequest(req);}} }6.2.5 延迟任务与周期任务 推荐使用ScheduleThreadPoolExecutor。 Timer存在的问题 1Timer支持基于绝对时间的调度机制因此任务的执行对系统时钟变化很敏感。ScheduleThreadPoolExecutor只支持基于相对时间的变化。 2Timer执行所有的定时任务时只会创建一个线程。如果某个任务的执行时间过长那么将破坏其他TimerTask的定时精确性。例如某个周期TimerTask需要每10ms执行一次而另一个需要40ms那么这个周期任务或者在40ms之后快速连续调用四次或者彻底丢失4次调用。 3Timer线程并不捕获异常。如果TimerTask抛出异常终止了定时任务timer不会回复线程执行而是会错误的认为整个Timer都被取消了。 因此已被调度但尚未执行的TimerTask将不会再执行新的任务也不会被调度。 程序清单 6-2-5-1 错误的Timer行为 import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.TimeUnit;public class OutOfTime {public static void main(String[] args) throws Exception {long startTime System.currentTimeMillis();Timer timer new Timer();timer.schedule(new ThrowTask(), 1);TimeUnit.SECONDS.sleep(1);long endTime System.currentTimeMillis();System.out.println(endTime - startTime);timer.schedule(new ThrowTask(), 1);TimeUnit.SECONDS.sleep(5);}static class ThrowTask extends TimerTask {Overridepublic void run() {throw new RuntimeException();}} }Exception in thread Timer-0 java.lang.RuntimeExceptionat executor.OutOfTime$ThrowTask.run(OutOfTime.java:22)at java.base/java.util.TimerThread.mainLoop(Timer.java:566)at java.base/java.util.TimerThread.run(Timer.java:516) 1002 Exception in thread main java.lang.IllegalStateException: Timer already cancelled.at java.base/java.util.Timer.sched(Timer.java:409)at java.base/java.util.Timer.schedule(Timer.java:205)at executor.OutOfTime.main(OutOfTime.java:15)程序一秒钟就结束了并抛出了异常。 在Java5.0或者更高的JDK中将很少使用Timer。 6.3 找出可利用的并行性 6.3.1 示例串行的页面渲染器 import java.util.ArrayList; import java.util.List;public class SingleThreadRender {void renderPage(CharSequence source) {renderText(source);ListImageData imageData new ArrayList();for (ImageInfo imageInfo : scanForImageInfo(source)) {imageData.add(imageInfo.downloadImage());}for (ImageData data : imageData) {renderImage(data);}} } 6.3.2 携带结果的任务Callable和Future 6.3.3 示例使用Future实现页面渲染器 程序清单6-3-3-1 使用Future等待图像下载 import java.util.ArrayList; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService;public class FutureRender {private final ExecutorService executor ...;void renderPage(CharSequence source) {final ListImageInfo imageInfos scanForImageInfo(source);CallableListImageData task new CallableListImageData() {Overridepublic ListImageData call() throws Exception {ListImageData result new ArrayList();for (ImageInfo imageInfo : imageInfos) {result.add(imageInfo.downloadImage());}return result;}};FutureListImageData future executor.submit(task);renderText(source);try {ListImageData imageDataList future.get();for (ImageData imageData : imageDataList) {renderImage(imageData);}} catch (InterruptedException e) {// 重新设置线程的中断状态Thread.currentThread().interrupt();// 由于不需要结果因此取消任务future.cancel(true);} catch (ExecutionException e) {throw launcherThrowable(e.getCause());}}}6.3.4 在异构任务并行化中存在的局限 只有大量相互独立且同构的任务可以并发进行处理时才能体现出将程序的工作负载分配到多个任务中带来的真正性能提升。 6.3.5 CompletionServiceExecutor与BlockingQueue 6.3.6 使用CompletionService实现页面渲染器 import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorCompletionService; import java.util.concurrent.ExecutorService;public class Render {private final ExecutorService excutor;Render(ExecutorService excutor) {this.excutor excutor;}void renderPage(CharSequence source) {ListImageInfo info scanForImageInfo(source);CompletionServiceImageData completionService new ExecutorCompletionService(excutor);for (final ImageInfo imageInfo: info) {completionService.submit(new CallableImageData() {Overridepublic ImageData call() throws Exception {return imageInfo.downloadImage();}});}renderText(source);try {for (int t 0, n info.size(); t n; t) {FutureImageData f completionService.take();ImageData imageData f.get();renderImage(imageData);}} catch (InterruptedException e) {Thread.currentThread().interrupt();} catch (ExecutionException e) {throw launcherThrowable(e.getCause());}} } 6.3.7 为任务设置时间 Page renderPageWithAd() throws InterruptedException {long endNanos System.nanoTime() END_BUDGET;FutureAd f excutor.submit(new FetchAdTask());// 在等待广告的同时显示页面。Page page renderPageBody();Ad ad;try {long timeLeft endNanos - System.nanoTime();ad f.get(timeLeft, TimeUnit.NANOSECONDS);} catch (ExecutionException e) {ad DEFAULT_AD;} catch (TimeoutException e) {ad DEFAULT_AD;f.cancel(true);}page.setAd(ad);return page;}6.3.8 示例旅行预订门户网站 import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit;private class QuoteTask implements CallableTravelQuote {private final TravelCompany company;private final TravelInfo travelInfo;Overridepublic TravelQuote call() throws Exception {return company.solicitQuote(travelInfo);} }public ListTravelQuote getRankedTravelQuotes(TravelInfo travelInfo, SetTravelCompany companies,ComparatorTravelQuote ranking, long time, TimeUnit unit) throws InterruptedException {ListQuoteTask tasks new ArrayList();for (TravelCompany company : companies) {tasks.add(new QuoteTask(company, travelInfo));}ListFutureTravelQuote futures exec.invokeAll(tasks, time, unit);ListTravelQuote quotes new ArrayList(futures.size());IteratorQuoteTask iterator tasks.iterator();for (FutureTravelQuote f : futures) {QuoteTask task iterator.next();try {quotes.add(f.get());} catch (ExecutionException e) {quotes.add(task.getFailureQuote(e.getCause()));} catch (CancellationException e) {quotes.add(task.getTimeoutQuote(e.getCause()));}}Collections.sort(quotes, ranking);return quotes; }
http://www.w-s-a.com/news/682542/

相关文章:

  • 做教育行业营销类型的网站徐州做网站多少钱
  • 临沂品牌网站制作企业网站建设搜集资料
  • wordpress注册验证码手机网站优化
  • 往建设厅网站上传东西做衣服的教程网站有哪些
  • 网上商城网站设计免费咨询口腔科医生回答在线
  • 南京网站c建设云世家 s浏览器
  • 如何做镜像别人网站wordpress菜单对齐修改
  • 长春网站建设net企业公示信息查询官网
  • 金鹏建设集团网站可在哪些网站做链接
  • 电子产品网站开发背景网站关键词优化方案
  • 建网站论坛wordpress提交数据库错误
  • 国内网站建设公司开源网站系统
  • 网站开发公司上大连网站建设流程图
  • 银川网站seo宁波网
  • 个人备案网站会影响吗网站添加 备案
  • 网站建设与电子商务的教案关于旅游网站建设的方案
  • 电子商务网站建设设计原则找做网站找那个平台做
  • 天津高端品牌网站建设韶关网站建设墨子
  • Wordpress多站点为什么注册不了2008iis搭建网站
  • 天津高端网站制作建网站的公司服务
  • 温州网站推广优化类似淘宝的网站怎么做的
  • 网站建设实训考试什么网站做玩具的比较多
  • 上海网站建设特点怎样给公司做一个网站做推广
  • 流量网站怎么做的济南优化排名公司
  • 保定网站制作套餐设计师导航网站大全
  • 惠州 商城网站建设石家庄新闻广播在线收听
  • 洪山网站建设域名购买之后怎么做网站
  • 北京网站建设公司服务哪家好wap是什么意思?
  • 怎么看公司网站做的好不好哦wordpress页面目录下
  • 做装修业务呢有多少网站平台搭建是什么