一启才福上线spider之后,开始关注程序的性能问题,比较典型的问题出了几个。


1、关于登录图片验证码,在非docker环境,共享session情况,服务器存储的是request中的param中,docker环境下,每次请求可能被不同的服务器处理,导致错误。最终使用通过本地cookie存储key_,然后存储/查询redis中的方式解决。


2、每日收益等接口数据响应时间长。

通过每日定时任务,保存数据的方式(接口数据静态化),减短响应时间。


3、系统容错耦合度高的问题

以收银台发的支付通知为例,需要多步处理。1、本地处理更新订单数据,2、通知产品中心支付接口。3、添加分销数据。4、发送邮件 5、更新用户新手状态 等,6返回状态码。

系统接了子渠道后,需要再添加一个功能,7、通知子渠道的通知状态,如果其中某一步出错,就需要产品中心不断的发定时通知,这显然是合理的。

通过本地订单状态,通过定时任务给子渠道发送订单状态。降低了系统之间的强依赖,减低了系统之间耦合度。


4、程序响应时间长的问题。

以收银台通知支付结果为例: 需要6-7步完成,考虑3把不相关的步骤多线程异步处理下。

1、考虑过时间监听器,给多个任务publishEvent方式分配不同的时间监听。

2、通过nio,设置缓冲区,比如rabbitMq消息队列方式去处理。

3、使用Furture方式,以下便是多线程一个简单应用。


比如,以做饭为例(假定步骤可能存在不合理),
1、从网上购买刀具,切菜板

2、去超市购买蔬菜,米面油

3、收到快递 及蔬菜到家后,开始做饭。


public class OnlineShopping implements Runnable{private Knife knife;@Overridepublic void run() {System.out.println("第一步:下单");System.out.println("第二步:等待送货");try {Thread.sleep(10000);}catch (InterruptedException e){e.printStackTrace();}System.out.println("第三步:快递送到");knife=new Knife();}public Knife getKnife() {return knife;}
}
public class MarketShopping implements Runnable{private Vegetable vegetable;@Overridepublic void run() {System.out.println("第一步:去超市");System.out.println("第二步:挑选蔬菜");try {Thread.sleep(5000);}catch (InterruptedException e){e.printStackTrace();}System.out.println("第三步:菜带回家");vegetable=new Vegetable();}public Vegetable getVegetable() {return vegetable;}
}
public class CommonCook {public static void main(String[] args) throws InterruptedException{//第一步long startTime = System.currentTimeMillis();OnlineShopping onlineShopping=new OnlineShopping();Thread thread=new Thread(onlineShopping);thread.start();MarketShopping marketShopping=new MarketShopping();Thread thread2=new Thread(marketShopping);thread2.start();thread.join();thread2.join();System.out.println("准备工作用时" + (System.currentTimeMillis() - startTime) + "ms,开始展示厨艺");cook(onlineShopping.getKnife(),marketShopping.getVegetable());System.out.println("饭做好总共用时" + (System.currentTimeMillis() - startTime) + "ms");}public static void cook(Knife knife,Vegetable vegetables){try {// 模拟做饭时间Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}}
}

第一步:下单
第二步:等待送货

第一步:去超市
第二步:挑选蔬菜
第三步:菜带回家
第三步:快递送到
准备工作用时10004ms,开始展示厨艺
饭做好总共用时20004ms

实现Runnable接口创建线程, 缺陷就是在执行完任务之后无法获取执行结果,使用thread.join(); 等待进程做完。

Callable 和 Runnable 都是执行的任务的接口,区别在于Callable有返回值,而Runnable无返回值。

下一篇,开始改造代码。

多线程的Furture应用(一)相关推荐

  1. 多线程编程七-Furture模式

    Furture模式是把一个任务拆成多个子任务,没有依赖关系的子任务来并行执运行的模式,旨在提高程序处理效率 假如说做饭需要三步,买菜(2秒).买油(3秒).炒菜(4秒)三步,其中买菜.买油可以两个人同 ...

  2. Java 多线程Thread

    重点: java中多线程运行原理 掌握两种线程创建方式 两种创建线程方式好处和弊端 掌握使用Thread类 中获取和设置线程名称的方法 使用匿名内部类创建多线程 描述java中线程池的运行原理 线程安 ...

  3. java中的tcp与多线程_Java5 多线程与TCP编程实践

    Java5增加了新的类库并发集java.util.concurrent,该类库为并发程序提供了丰富的API多线程编程在Java 5中更加容易,灵活.本文通过一个网络服务器模型,来实践Java5的多线程 ...

  4. python并发编程:协程asyncio、多线程threading、多进程multiprocessing

    python并发编程:协程.多线程.多进程 CPU密集型计算与IO密集型计算 多线程.多进程与协程的对比 多线程 创建多线程的方法 多线程实现的生产者-消费者爬虫 Lock解决线程安全问题 使用线程池 ...

  5. Java 多线程概述

    多线程技术概述 1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间. 线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换.并发执行,一个进程最少有一个线程, ...

  6. Java 多线程的基本方式

    Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

  7. RPC 笔记(08)— socket 通信(多进程多线程服务器)

    在上一节中如果并行的客户端连接数超过了默认开启进程的数量,那么后来的客户端请求将会阻塞,为了不阻塞新的客户端,我们可以将进程的单线程改成多线程即可. ​ 服务端代码: import json impo ...

  8. Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步

    主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...

  9. Python 多线程总结(1)- thread 模块

    thread 模块 1. 单线程 首先看下单线程程序运行的例子,如下所示, import timedef loop0():print 'start loop0 begin', time.ctime() ...

最新文章

  1. CentOS, 高速设置ssh无password登录
  2. JavaScript: 代码简洁之道
  3. C#——事件(Event)DEMO[闻鸡起舞]
  4. [Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽运算
  5. 循环内的局部变量和性能
  6. 消息测试服务器,测试统一消息服务器功能
  7. oracle 插入含字符串
  8. work summary(1)
  9. html的调用方法详解,HTML5标签使用方法详解
  10. VC++ 窗口拆分CSplitterWnd
  11. 几款流行的开源后台管理框架
  12. 创新者的窘境 PDF ——带完整书签
  13. winserver 2016密钥
  14. shenyu自定义插件
  15. java http 手机浏览器下载word文档失败的问题
  16. Java中,如何把ascii码转换成字符?
  17. Scipy_常用统计函数
  18. 贝叶斯算法 — 朴素贝叶斯分类器— 过滤垃圾邮件 — 流失用户 — 用户画像
  19. 向人工盘点库存和物品说再见
  20. Office Professional Plus 2016简体中文版

热门文章

  1. 智慧城市----物联网
  2. 传智播客PHP笔记05-thinkphp框架-视图渲染、display,fetch,模板替换,模板变量的赋值与实现,系统变量,模板函数,模板运算符,foreach,if,比较标签,volist标签
  3. 12个免费学习编程的网站
  4. 企业管理信息系统整体业务流程图
  5. 把代码和环境做成docker镜像_新手指南:如何将应用打包成为 Docker 镜像?
  6. matlab调用surfer绘制等值线
  7. 【golang】实现依赖注入
  8. Ubuntu 12.04 配置记录
  9. 【软件评测】06计算机网络基础知识
  10. PhpStorm 链接管理Mysql数据库(远程数据库和本地数据库)