给自己写的程序条毛病(r12笔记第68天)

  
前几那天写了一个Java程序模拟生产者消费者,当时写完还感觉不错,但是这几天再看的时候发现还是有很多的不足之处,给别人挑毛病不大好意思,尺度拿捏不好还容易得罪人,男人就对自己狠一点,我就给自己多挑挑程序的毛病,这个可以有,有些细微的毛病就马上改了,有些有难度的,我也记录下来,不断的改进,看起来简单的程序写好了才算是一个合格的程序员。

   感兴趣的同学可以移步这里,看看之前写的程序。

http://www.toutiao.com/i6420749007307407873/

   我大体总结了下,从日志中可以看出有这么几个明显的小问题。

  1. 第一种模式和第二种模式的线程数不同,明显第二种模式的线程日志有长得多。
  2. 第二种模式的消费者申请的消费产品数和规格不符,应该为10的倍数,第二种模式没有取整,这样看起来不是很清晰。
  3. 第一种和第二种模式,生产者和消费者对应的产品数不能为0,这种场景其实不应该存在的,所以就可以考虑从随机数或者从对象层级进行校验,至少规范来看,入参要规范,所以我从随机数生成逻辑上进行校验控制。
  4. 生产线程和消费线程虽然是动态生成,但是从日志可以看到有明显的串行执行的痕迹,可以把这个过程做成真正的动态,库存不足,生产者生产,库存充足,消费者消费。如果把生产者消费者这个模型看做是一个系统,就好比一个齿轮,一个直接的目标就是让齿轮转动的快。
  5. 无论第一种模式还是第二种模式,如果碰到条件不满足的情况就会存在等待的情况,这个等待的频率可以借鉴一些数据库层面的经验,来优化控制一下,比如第一次等待,sleep多少毫秒,第二次sleep多少毫秒,这样有一个基本的控制范围,减少中断的次数。
  6. 这个库存其实就像MySQL面刷脏页一样,脏页数达到多少的时候来触发生产者生产,能够尽可能减少生产者等待的频率,提高消费者消费的频率。
  7. 其实目前的实现,如果细细想来,原本生产者消费者的性能瓶颈现在落到仓库上,但是目前仓库应该有几个门,控制入库,控制出库,而不能总是在一个门里,要么把门加宽,要么多加几个门,入口和出口分开。
  8. 为了尽可能提高吞吐量,整个实现过程也可以考虑通过事务的方式来控制,比如放到一个仓库的表里,对于数据进行实时的变更和查询,或者使用其他的数据结构。
  9. 为了尽可能突破单个仓库的瓶颈,可以考虑设置多个仓库,这样库存能够大大大提高,而且是一个线性扩展的方式,当然这就会引进更多的考虑和方案
  10. 尽可能提高消费者线程的使用率,比如考虑使用线程池等等方式来实现。

  最后硬凑一个观点吧,那就是一个牛叉的程序构思好了,能够在短时间内实现出来,光说不做太虚,能说能做才是真。

  或者说你有更多的建议,也给提提吧,感激不尽。

时间: 2024-09-24 06:08:45

给自己写的程序条毛病(r12笔记第68天)的相关文章

Oracle和MySQL竟然可以这么写这样的SQL?(r12笔记第99天)

今天看到Franck Pachot?发了一个Twitter,意思是Oracle里的SQL还能这么写.猛一看确实让人有些意外. 禁不住诱惑,自己也尝试了一番.我现在12cR2的环境中测试了一下. Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 尝试上面的步骤,先来看看dual表. SQL> select count(*)from dual;   COUNT(*) ----------     

高分请高手写个程序,要求把textbox.text中的内容写到数据库SQl2000中.textbox.text中的是一偏文章文章已经用中文分词软件分好

问题描述 高分请高手写个程序,要求把textbox.text中的内容写到数据库SQl2000中.textbox.text中的是一偏文章文章已经用中文分词软件分好,词与词之间用制表符分好.求高手写个程序~ 解决方案 解决方案二:分词能做好,怎么会不知道怎么操作数据库呢解决方案三:protectedvoidbtnEditor_Click(objectsender,EventArgse){//读取数据库连接字符串stringconn=ConfigurationSettings.AppSettings[

小程序 求解-这里有一题ACM的小题目,求众神解答。帮写个程序。小弟冰天雪地裸奔哭嚎以示感谢!

问题描述 这里有一题ACM的小题目,求众神解答.帮写个程序.小弟冰天雪地裸奔哭嚎以示感谢! 邮局选址: 在一个按照东西和南北方向划分成规整街区的城市里,n 个居民点散乱的分布在不同的街区中.用X坐标表示东西向,用Y坐标表示南北向,各居民点的位置可以有坐标(XY)表示.街区中任意2点(X1,Y1)和(X2,Y2)质检的距离可以用数值丨X1-X2丨+丨Y1-Y2丨度量.居民们希望在城市中选择建立邮局的最佳位置,使n 个居民点到邮局的距离总和最小. 编程任务: 给定n 个居民点的位置,计算n个居民点到

工程-vc++6.0写的程序用vs2010打开需要改变些什么

问题描述 vc++6.0写的程序用vs2010打开需要改变些什么 要整理一个程序 ,不是自己写的,原来是vc++6.0写的,现在用vs2010打开报一些很奇怪的错,都指向头文件,complex 还有string 搞了很长时间了,哪位大神给解答一下,小弟感激不尽啊,谢谢 解决方案 这可能是头文件的错误.因为不同的编译器可能将库文件放在不同的头文件中,所以要想把错误改正,需要了解需要的头文件放在那个库中.其实用遵循统一标准的编译器就可以避免这些问题,可以用linux gcc 编译器! 解决方案二:

java方式来写js程序(demo)

js|程序  javascript应用是非常广泛的,而且功能特别强大,但是javascript程序就是没有java代码好看,这点是好无疑问的,不过因为js应用太广了,在web应用中几乎离不开它,我初学js,总想像写java程序那样写js. 一个是过滤相同的元素:<script src="core.js"></script><script src="collection.js"></script><script&g

c语言-C语言自己写的程序有个小错,求改下

问题描述 C语言自己写的程序有个小错,求改下 #includeint main(){ int nlkyt1t2t3;char x1x2x3;t1=0;t2=0;t3=0; printf(""请输入现在队伍的列数:n""); scanf(""%d""&n); printf(""拉面的制作时间:n""); scanf(""%d""&l)

tinyos-在tinyOS下写nec程序,在一组无线节点中进行数据包转发及打印

问题描述 在tinyOS下写nec程序,在一组无线节点中进行数据包转发及打印 10C 选取一个节点作为数据源节点,向网络中的其它节点进行数据包的转发,并将数据包中的内容打印出来. 解决方案 tiny OS第一次听说.有空去百度一下看看.先帮楼主顶下先!

如何mvc规范写jsp-view,action,service,dao,domain,如何按照mvc规范写jsp程序

问题描述 view,action,service,dao,domain,如何按照mvc规范写jsp程序 我现在开始学习mvc分层架构,但是是不知道如何下手,知道程序应该差不多是按照控制层action->显示层view->业务层service->数据处理层dao,我先写了domain层,但是又不知道要从哪里接着写了,总是写着写着逻辑就乱了,请问大概要按照什么顺序写逻辑清晰一点呢?各个层之间怎么联系起来?请大大侠们帮忙. 解决方案 domain层是??? 说说我自己的一点看法,可能有点不准确

苹果-C# 写的程序为什么在虚拟机上运行不了?

问题描述 C# 写的程序为什么在虚拟机上运行不了? 客户用的是苹果机,虚拟机上装了windows系统,也有.netframework运行环境,程序在本机上也能运行,在他那就是运行不起来,一运行就提示"xxxx已停止工作" 解决方案 和虚拟机无关,虚拟机上是否是山寨盗版windows,导致.net framework工作不正常.在你的程序中main中的第一行加上一个messagebox.show,如果看不到框就出错了,那就是环境的问题了. 建议去 msdn.itellyou.cn 下载原