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

网站开发工程师好不好公众号里的电影网站怎么做

网站开发工程师好不好,公众号里的电影网站怎么做,编程培训机构价格,网站重新建设的申请书目录 一、线程1、初始化线程的 4 种方式2、线程池的七大参数3、线程池的运行流程#xff1a;4、例子5、常见的 4 种线程池6、开发中为什么使用线程池 二、CompletableFuture 异步编排0、业务场景#xff1a;1、创建异步对象2、计算完成时回调方法3、handle 方法4、线程串行化… 目录 一、线程1、初始化线程的 4 种方式2、线程池的七大参数3、线程池的运行流程4、例子5、常见的 4 种线程池6、开发中为什么使用线程池 二、CompletableFuture 异步编排0、业务场景1、创建异步对象2、计算完成时回调方法3、handle 方法4、线程串行化方法5、两任务组合 - 都要完成6、两任务组合 - 一个完成7、多任务组合 三、测试代码 一、线程 1、初始化线程的 4 种方式 1、继承 Thread 2、实现 Runnable 接口 3、实现 Callable 接口 FutureTask 可以拿到返回结果可以处理异常 4、线程池 方式 1 和方式 2主进程无法获取线程的运算结果。不适合当前场景 方式 3主进程可以获取线程的运算结果但是不利于控制服务器中的线程资源。可以导致服务器资源耗尽。 方式 4通过如下两种方式初始化线程池 Executors.newFiexedThreadPool(3); //或者 new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit unit, workQueue, threadFactory, handler);通过线程池性能稳定也可以获取执行结果并捕获异常。但是在业务复杂情况下一个异步调用可能会依赖于另一个异步调用的执行结果。 2、线程池的七大参数 * param corePoolSize the number of threads to keep in the pool, even * if they are idle, unless {code allowCoreThreadTimeOut} is set 池中一直保持的线程的数量即使线程空闲。除非设置了 allowCoreThreadTimeOut * param maximumPoolSize the maximum number of threads to allow in the * pool 池中允许的最大的线程数 * param keepAliveTime when the number of threads is greater than * the core, this is the maximum time that excess idle threads * will wait for new tasks before terminating. 当线程数大于核心线程数的时候线程在最大多长时间没有接到新任务就会终止释放 最终线程池维持在 corePoolSize 大小 * param unit the time unit for the {code keepAliveTime} argument 时间单位 * param workQueue the queue to use for holding tasks before they are * executed. This queue will hold only the {code Runnable} * tasks submitted by the {code execute} method. 阻塞队列用来存储等待执行的任务如果当前对线程的需求超过了 corePoolSize 大小就会放在这里等待空闲线程执行。 * param threadFactory the factory to use when the executor * creates a new thread 创建线程的工厂比如指定线程名等 * param handler the handler to use when execution is blocked * because the thread bounds and queue capacities are reached 拒绝策略如果线程满了线程池就会使用拒绝策略。3、线程池的运行流程 1、线程池创建准备好 core 数量的核心线程准备接受任务 2、新的任务进来用 core 准备好的空闲线程执行。 (1) 、core 满了就将再进来的任务放入阻塞队列中。空闲的 core 就会自己去阻塞队列获取任务执行 (2) 、阻塞队列满了就直接开新线程执行最大只能开到 max 指定的数量 (3) 、max 都执行好了。Max-core 数量空闲的线程会在 keepAliveTime 指定的时间后自动销毁。最终保持到 core 大小 (4) 、如果线程数开到了 max 的数量还有新任务进来就会使用 reject 指定的拒绝策略进行处理 3、所有的线程创建都是由指定的 factory 创建的。 4、例子 一个线程池 core 7 max 20 queue50100 并发进来怎么分配的 先有 7 个能直接得到执行接下来 50 个进入队列排队在多开 13 个继续执行。现在 70 个被安排上了。剩下 30 个默认拒绝策略。 5、常见的 4 种线程池  newCachedThreadPool  创建一个可缓存线程池如果线程池长度超过处理需要可灵活回收空闲线程若无可回收则新建线程。  newFixedThreadPool  创建一个定长线程池可控制线程最大并发数超出的线程会在队列中等待。  newScheduledThreadPool  创建一个定长线程池支持定时及周期性任务执行。  newSingleThreadExecutor  创建一个单线程化的线程池它只会用唯一的工作线程来执行任务保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。 6、开发中为什么使用线程池 1、降低资源消耗 通过重复利用已经创建好的线程降低线程的创建与销毁带来的损耗 2、提高响应速度 因为线程池中的线程数没有超过线程池最大上线时有的线程处于等待分配任务的状态当任务来时无需创建新的线程就能执行 3、提高线程的可管理性 线程池会根据当前系统的特点对池内的线程进行优化处理减少创建和销毁线程带来的系统开销。无限的创建和销毁不仅消耗系统资源还降低系统的稳定性使用线程池进行统一分配。 二、CompletableFuture 异步编排 0、业务场景 查询商品详情页的逻辑比较复杂有些数据还需要远程调用必然需要花费更多的时间。 假如商品详情页的每个查询需要如下标注的时间才能完成 那么用户需要 5.5s 后才能看到商品详情页的内容。很显然是不能接受的。 如果有多个线程同时完成这 6 步操作也许只需要 1.5s 即可完成响应。 Future是java5添加的类用来描述一个异步计算的结果。你可以使用isDone方法检查计算是否完成或者使用get阻塞住调用线程知道计算完成返回结果你也可以使用canel方法停止任务的执行。 虽然Future以及相关使用方法提供了异步执行任务的能力但是对于结果的获取却是很不方便只能通过阻塞或者轮询的方式得到任务的结果。阻塞的方式显然和我们的异步编程的初衷相违背轮询的方式又会耗费无谓的 CPU 资源而且也不能及时地得到计算结果为什么不能用观察者设计模式当计算结果完成及时通知监听者呢 很多语言比如 Node.js采用回调的方式实现异步编程。Java 的一些框架比如 Netty自己扩展了 Java 的 Future接口提供了addListener等多个扩展方法Google guava 也提供了通用的扩展 FutureScala 也提供了简单易用且功能强大的 Future/Promise 异步编程模式。 作为正统的 Java 类库是不是应该做点什么加强一下自身库的功能呢 在 Java 8 中, 新增加了一个包含 50 个方法左右的类: CompletableFuture提供了非常强大的Future 的扩展功能可以帮助我们简化异步编程的复杂性提供了函数式编程的能力可以通过回调的方式处理计算结果并且提供了转换和组合 CompletableFuture 的方法。 CompletableFuture 类实现了 Future 接口所以你还是可以像以前一样通过get方法阻塞或者轮询的方式获得结果但是这种方式不推荐使用。 CompletableFuture 和 FutureTask 同属于 Future 接口的实现类都可以获取线程的执行结果。 1、创建异步对象 CompletableFuture 提供了四个静态方法来创建一个异步操作。 1、runXxxx 都是没有返回结果的supplyXxx 都是可以获取返回结果的 2、可以传入自定义的线程池否则就用默认的线程池 2、计算完成时回调方法 whenComplete 可以处理正常和异常的计算结果exceptionally 处理异常情况。 whenComplete 和 whenCompleteAsync 的区别 whenComplete是执行当前任务的线程继续执行 whenComplete 的任务。 whenCompleteAsync是执行把 whenCompleteAsync 这个任务继续提交给线程池来进行执行。 方法不以 Async 结尾意味着 Action 使用相同的线程执行而 Async 可能会使用其他线程执行如果是使用相同的线程池也可能会被同一个线程选中执行 public class CompletableFutureDemo { public static void main(String[] args) throws ExecutionException, InterruptedException { CompletableFuture future CompletableFuture.supplyAsync(new SupplierObject() { Override public Object get() { System.out.println(Thread.currentThread().getName() \t completableFuture); int i 10 / 0; return 1024; } }).whenComplete(new BiConsumerObject, Throwable() { Override public void accept(Object o, Throwable throwable) { System.out.println(-------o o.toString()); System.out.println(-------throwable throwable); } }).exceptionally(new FunctionThrowable, Object() { Override public Object apply(Throwable throwable) { System.out.println(throwable throwable); return 6666; } }); System.out.println(future.get()); } }3、handle 方法 和 complete 一样可对结果做最后的处理可处理异常可改变返回值。 4、线程串行化方法 thenApply 方法当一个线程依赖另一个线程时获取上一个任务返回的结果并返回当前任务的返回值。 thenAccept 方法消费处理结果。接收任务的处理结果并消费处理无返回结果。 thenRun 方法只要上面的任务执行完成就开始执行 thenRun只是处理完任务后执行thenRun 的后续操作 带有 Async 默认是异步执行的。同之前。 以上都要前置任务成功完成。 Function? super T,? extends U T上一个任务返回结果的类型 U当前任务的返回值类型 5、两任务组合 - 都要完成 两个任务必须都完成触发该任务。 thenCombine组合两个 future获取两个 future 的返回结果并返回当前任务的返回值 thenAcceptBoth组合两个 future获取两个 future 任务的返回结果然后处理任务没有返回值。 runAfterBoth组合两个 future不需要获取 future 的结果只需两个 future 处理完任务后处理该任务。 6、两任务组合 - 一个完成 当两个任务中任意一个 future 任务完成的时候执行任务。 applyToEither两个任务有一个执行完成获取它的返回值处理任务并有新的返回值。 acceptEither两个任务有一个执行完成获取它的返回值处理任务没有新的返回值。 runAfterEither两个任务有一个执行完成不需要获取 future 的结果处理任务也没有返回值。 7、多任务组合 三、测试代码 import java.util.concurrent.*;public class ThreadTest {public static ExecutorService executor Executors.newFixedThreadPool(10);public static void main(String[] args) throws ExecutionException, InterruptedException {// System.out.println(main......start.....);// Thread thread new Thread01();// thread.start();// System.out.println(main......end.....);// Runable01 runable01 new Runable01();// new Thread(runable01).start();// FutureTaskInteger futureTask new FutureTask(new Callable01());// new Thread(futureTask).start();// System.out.println(futureTask.get());// service.execute(new Runable01());// FutureInteger submit service.submit(new Callable01());// submit.get();System.out.println(main......start.....);// CompletableFutureVoid future CompletableFuture.runAsync(() - {// System.out.println(当前线程 Thread.currentThread().getId());// int i 10 / 2;// System.out.println(运行结果 i);// }, executor);/*** 方法完成后的处理*/// CompletableFutureInteger future CompletableFuture.supplyAsync(() - {// System.out.println(当前线程 Thread.currentThread().getId());// int i 10 / 0;// System.out.println(运行结果 i);// return i;// }, executor).whenComplete((res,exception) - {// //虽然能得到异常信息但是没法修改返回数据// System.out.println(异步任务成功完成了...结果是 res 异常是 exception);// }).exceptionally(throwable - {// //可以感知异常同时返回默认值// return 10;// });/*** 方法执行完后端处理*/// CompletableFutureInteger future CompletableFuture.supplyAsync(() - {// System.out.println(当前线程 Thread.currentThread().getId());// int i 10 / 2;// System.out.println(运行结果 i);// return i;// }, executor).handle((result,thr) - {// if (result ! null) {// return result * 2;// }// if (thr ! null) {// System.out.println(异步任务成功完成了...结果是 result 异常是 thr);// return 0;// }// return 0;// });/*** 线程串行化* 1、thenRunL不能获取上一步的执行结果* 2、thenAcceptAsync能接受上一步结果但是无返回值* 3、thenApplyAsync能接受上一步结果有返回值**/CompletableFutureString future CompletableFuture.supplyAsync(() - {System.out.println(当前线程 Thread.currentThread().getId());int i 10 / 2;System.out.println(运行结果 i);return i;}, executor).thenApplyAsync(res - {System.out.println(任务2启动了... res);return Hello res;}, executor);System.out.println(main......end..... future.get());}private static void threadPool() {ExecutorService threadPool new ThreadPoolExecutor(200,10,10L,TimeUnit.SECONDS,new LinkedBlockingDequeRunnable(10000),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());//定时任务的线程池ExecutorService service Executors.newScheduledThreadPool(2);}public static class Thread01 extends Thread {Overridepublic void run() {System.out.println(当前线程 Thread.currentThread().getId());int i 10 / 2;System.out.println(运行结果 i);}}public static class Runable01 implements Runnable {Overridepublic void run() {System.out.println(当前线程 Thread.currentThread().getId());int i 10 / 2;System.out.println(运行结果 i);}}public static class Callable01 implements CallableInteger {Overridepublic Integer call() throws Exception {System.out.println(当前线程 Thread.currentThread().getId());int i 10 / 2;System.out.println(运行结果 i);return i;}}}
http://www.zqtcl.cn/news/628894/

相关文章:

  • 免费网站商城模板宁波企业网站搭建图片
  • 上海网站备案查询建站图标素材
  • 贵州省住房和建设厅网网站网站页面设计报告
  • 做网站友汇网快速建设网站视频教程
  • 物流公司做网站注重什么官网的网站设计公司
  • 网站备案 2016电子商务平台起名
  • 济南建站详情房地产市场分析
  • 南宁品牌网站建设公司中国商业企业网
  • 建设招标网官方网站电脑版做系统简单还是网站简单
  • 网站平台建设总结品牌网页
  • 网站建设如何就接入支付宝企业云平台
  • swoole做网站做网站建设的上市公司有哪些
  • 建设银行江苏官网招聘网站网站设置首页连接分类页的视频教程
  • 通过dede访问自己做的网站高端 建站
  • wordpress自定义json温岭新站seo
  • 网站开发的五个阶段wordpress安装在本地
  • 郴州网站建设有哪些sem优化
  • 在百度怎么申请自己的网站深圳网站建设迅美
  • wordpress 企业网站教程网站开发集成软件
  • 专业的西安免费做网站wordpress手机端插件
  • 口碑好网站建设优化大师win10下载
  • 网站建设普及型小程序开发平台好的有哪些
  • 网站建设与管理专业凡科做的网站好吗
  • wordpress添加变量福州seo网站管理
  • 哔哩哔哩免费网站观看网站制作合同书
  • 自流井移动网站建设建设网站的一般步骤
  • 手机导航网站模板上海低价网站建设
  • 如何开公司注册需要多少钱东莞网站推广优化网上推广公司
  • 新闻门户网站制作教育培训网站开发
  • 网站建设公司哪个好一点最近一周的热点新闻