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

网站的建设目标文档国内it培训机构排名

网站的建设目标文档,国内it培训机构排名,男男床做视频网站,上海找做网站公司1. 背景 在项目开发中, 通常会有异步执行操作, 例如: 提交一个异步清空一系列数据库中ID ${_id} 的记录, 这个时候通常的做法是主线程将任务添加到一个异步队列中, 后台维护一个线程不断地循环扫描这个队列, 如果有需要执行的任务, 则执行相应的逻辑. 如下图所示: 2. 一个简…

1. 背景

在项目开发中, 通常会有异步执行操作, 例如: 提交一个异步清空一系列数据库中ID = ${_id} 的记录, 这个时候通常的做法是主线程将任务添加到一个异步队列中, 后台维护一个线程不断地循环扫描这个队列, 如果有需要执行的任务, 则执行相应的逻辑. 如下图所示:
在这里插入图片描述

2. 一个简单的异步执行方法

代码实现如下所示:

public class AsyncExecutor {private static final Deque<AsyncTaskEntity> taskQueue = new ConcurrentLinkedDeque<>();public AsyncExecutor() {Thread thread = new Thread(() -> {while (true) {try {if (taskQueue.isEmpty()) {// 休眠50毫秒ThreadUtil.sleep(50);continue;}AsyncTaskEntity entity = taskQueue.pollFirst();execute(entity);} catch (Exception e) {LOGGER.error("异步执行任务出现异常!", e);}}});thread.setName("异步任务执行器");thread.start();System.out.println("analysis异步队列任务启动完成!");}public static <T> void asyncExecute(AsyncTaskEntity<T> entity) {taskQueue.push(entity);}
}/*** 队列中任务对象封装*/
@Data
public class AsyncTaskEntity <T>{// 消费的参数private T param;public AsyncTaskEntity(T param){this.param = param;}
}

有了上面的异步执行器之后, 这里我们写一个main方法, 在main方法中通过异步的方式执行一些任务:

public class Main{public static AsyncExecutor asyncExecutor = new AsyncExecutor();public static void main(String[] args) throws Exception;{for(int i = 0;i<10;i++){asyncExecutor.asyncExecute(new AsyncTaskEntity<Integer>(i));}Thread.sleep(10_000);}
}

到此为止一个简单清晰的异步调用逻辑就已经写完了. 但是现在不得不考虑一个事情, 异步线程中while(true)会一直空转, 即使没有任务。因此下面我们使用wait - notify进行优化

3. 优化版本1 - 使用wait - notify

wait - notify是Object对象中为我们提供的两个native方法, 这两个方法只能在synchronized关键字修饰的同步代码块中使用。Thread.sleep()方法不会释放锁,wait()方法会释放锁,直到被其他线程notify之后,才会重新获得锁。我们对上述异步队列进行改造:

public class AsyncExecutor {private static final Deque<AsyncTaskEntity> taskQueue = new LinkedBlockingDeque<>();public AsyncExecutor() {Thread thread = new Thread(() -> {while (true) {synchronized(this){try {if (taskQueue.isEmpty()) {this.wait();}AsyncTaskEntity entity = taskQueue.pollFirst();execute(entity);} catch (Exception e) {LOGGER.error("异步执行任务出现异常!", e);}}}});thread.setName("异步任务执行器");thread.start();System.out.println("analysis异步队列任务启动完成!");}public synchronized <T> void asyncExecute(AsyncTaskEntity<T> entity) {taskQueue.push(entity);this.notify();}
}

经过上面改造之后,当后台队列中任务为空时,轮训扫描线程就会进入到this.wait()逻辑,此时会释放synchronized获取到的this锁。因此调用asyncExecute()方法会正常的获取到this锁。当push数据之后,执行了notify,便会唤醒一个当前this上正在wait()的线程。这种方式就避免了占用资源始终空转的问题。

其实结合线程的三种核心状态可以更好的理解,当调用wait()方法时,该线程会放弃CPU执行权,进入到阻塞状态,直到被其他线程唤醒(notify())。

http://www.hrbkazy.com/news/39961.html

相关文章:

  • 建设银行卡授权网站管理宁波seo优化排名
  • 网站开发在无形资产中做个公司网站大概多少钱
  • 中国品牌建设促进会网站许昌网络推广外包
  • o2o网站建设方案 多少钱深圳推广优化公司
  • 外包做网站多少钱网络营销服务商
  • 网站背景如何做百度网站入口
  • 做视频的网站靠什么收入外贸seo公司
  • 做网站需要留什么淘宝权重查询
  • 茌平做网站推广如何做网站营销推广
  • 电脑版和手机版网站怎么做的做小程序要多少钱
  • 杭州网站建设排名百度如何收录网站
  • 我的网站突然找不到网页了百度广告联盟
  • 视频网站 如何做seoqq群排名优化软件官网
  • 设计师合作网站白山seo
  • 群辉 wordpress汉化seogw
  • 网站域名代备案网站日常维护有哪些
  • 佛山 做网站公司seo教程百度网盘
  • 阜阳恒亮做网站多少钱seo是搜索引擎营销吗
  • 网站建设制作设计seo优化南宁百度搜索引擎入口登录
  • 网站seo优化书籍交换友情链接平台
  • 网站程序盗版seo短视频网页入口引流
  • 龙岗优化网站建设巨量引擎广告投放平台
  • 手机网站制作网站推广途径和要点
  • 企业网站内容更新怎么操作自动收录网
  • 手机门户网站建设方案青岛做网络推广的公司有哪些
  • 装修设计软件知乎seo关键词快速排名软件
  • 辽宁阜新建设学校官方网站seo推广骗局
  • 如何做网站迁移网址seo优化排名
  • 专门做钱币的网站域名邮箱 400电话
  • 手机网站建设行业分析最近的新闻大事10条