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

郑州网站推广排名公司太仓网站制作

郑州网站推广排名公司,太仓网站制作,辽宁网上注册公司流程,室内设计联盟效果图在开发过程中,我们难免会因为性能、实时响应等,需要异步处理的一些事务,并且在子线程中有时我们还需要获取主线程相关的参数。下面有若干方案可以实现上述场景,但会出现一定的问题。 场景1-基础场景 在主线程中开启子线程&#x…

在开发过程中,我们难免会因为性能、实时响应等,需要异步处理的一些事务,并且在子线程中有时我们还需要获取主线程相关的参数。下面有若干方案可以实现上述场景,但会出现一定的问题。

场景1-基础场景

在主线程中开启子线程,在子线程中获取主线程的参数。
重点:子线程中逻辑处理时间较短,在主线程结束前获取主线程的参数。

package com.lihao.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** @author lihao*/
@RestController
@RequestMapping("/test1")
public class Test1 {/*** 自定义线程池*/private ExecutorService executor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),Runtime.getRuntime().availableProcessors(),5,TimeUnit.MINUTES,new LinkedBlockingQueue<>(100),Thread::new,new ThreadPoolExecutor.AbortPolicy());@GetMapping("/asyncTest")public String asyncTest(HttpServletRequest request) {request.setAttribute("key1","value1");// 异步处理任务executor.submit(() -> doExe(request));return "OK";}public void doExe(HttpServletRequest request){System.out.println("值:" + request.getAttribute("key1"));}
}

执行结果:

值:value1

我们可以正常拿到主线程的参数。

场景2-场景1的变种

在主线程中开启子线程,在子线程中获取主线程的参数。
重点:子线程在执行一段时间后再获取主线程的参数,这个时候主线程已执行完成了。

@GetMapping("/asyncTest")public String asyncTest(HttpServletRequest request) {request.setAttribute("key1","value1");// 异步处理任务executor.submit(() -> doExe(request,1000L));return "OK";}public void doExe(HttpServletRequest request,long sleepTime){try {Thread.sleep(sleepTime);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("值:" + request.getAttribute("key1"));}

执行结果:

值:null

由于子线程sleep了一秒,这个时候主线程已经执行完成,子线程如果想继续获取主线程的参数,就会拿不到值。

场景3-场景1的完善

在主线程中开启子线程,在子线程中获取主线程的参数。
重点:子线程在执行一段时间后再获取主线程的参数,主线程需要等待子线程执行完成后,再结束。

@GetMapping("/asyncTest")public String asyncTest(HttpServletRequest request) {request.setAttribute("key1","value1");// 异步处理任务Future<?> future = executor.submit(() -> doExe(request, 10000L));try {future.get();} catch (InterruptedException | ExecutionException e) {throw new RuntimeException(e);}return "OK";}public void doExe(HttpServletRequest request,long sleepTime){try {Thread.sleep(sleepTime);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("值:" + request.getAttribute("key1"));}

虽然子线程执行时间较长,但仍可以获取主线程的参数,主线程在子线程执行完成后再结束。
主要技术:通过future.get();来使主线程阻塞。
缺点:主线程等待时间较长,消息无法实时返回,需要等待子线程执行完成后再返回。

场景4-场景1、2、3的优化

在主线程中开启子线程,在子线程中获取主线程的参数。
重点:子线程在执行一段时间后再获取主线程的参数,主线程无需要等待子线程执行完成,可立即结束。

    @GetMapping("/asyncTest")public String asyncTest(HttpServletRequest request) {request.setAttribute("key1","value1");// 开启异步AsyncContext asyncContext = request.startAsync();executor.submit(() -> doExe(asyncContext,request, 10000L));return "OK";}public void doExe(AsyncContext asyncContext,HttpServletRequest request,long sleepTime){try {Thread.sleep(sleepTime);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("值:" + request.getAttribute("key1"));asyncContext.complete();}

虽然子线程执行时间较长,但仍可以获取主线程的参数,主线程无需等待子线程执行完成,可立即返回。

核心技术点:

  • 开启异步 AsyncContext asyncContext = request.startAsync();
  • 子线程执行完后调用: asyncContext.complete();

具体原理:可阅读源码。

彩蛋

场景4在部分框架下失效,如项目中引用Spring- Security框架等,会导致主线程开启子线程后阻塞,具体原因待分析。其他场景下可正常使用。

http://www.yidumall.com/news/19926.html

相关文章:

  • 做网站用动易siteweaver cms还是phpcms淄博信息港聊天室网址
  • 阳泉购物网站开发设计网店代运营可靠吗
  • 自己的电脑做服务区 网站典型的口碑营销案例
  • 网站建设有必要做手机端吗东莞商城网站建设
  • 小程序开发平台哪家服务好北京seo推广外包
  • 搜索引擎网站排名官方百度
  • 上海哪家公司做网站比较好个人博客网站模板
  • 滨州正规网站建设哪家好百度文库个人登录入口
  • 技术支持 嘉兴网站建设厦门网站建设公司名单
  • 西安有什么好玩的地方轻松seo优化排名
  • 免费的小网站百度经验发布平台
  • 3如何做网站推广搜狗站长平台主动提交
  • 白银做网站网站优化方案怎么写
  • 网站防采集如何建立一个自己的网站?
  • 手机模版网站价格微信seo是什么意思
  • 网站 日历插件网站数据统计工具
  • 音乐网站开发文档全网营销平台
  • 网站发送邮件功能seo学徒
  • 惠州做公司网站做谷歌推广比较好的公司
  • 哪个网站专题做的好免费建立个人网站
  • 北京市住房城乡建设委官方网站做关键词优化
  • wordpress自适应博客主题郑州seo关键词排名优化
  • 做网站的宽和高有限制吗广告营销包括哪些方面
  • 一个网站为什么做的不好看买域名
  • 做电商网站价钱深圳最新疫情
  • 日本巨乳做视频网站东莞关键词排名提升
  • 怎么判断代运营是真是假seo确定关键词
  • 做粘土的网站市场营销策划方案3000字
  • 有哪些网站免费做推广百度爱采购客服电话
  • 视频网站建设费用网络营销策划书3000字