一、需求分析

利用java线程的相关知识实现

1)单部多线程傻瓜调度(FAFS)电梯

2)单部多线程可捎带调度(ALS)电梯

3)多部多线程智能(SS)调度电梯

二、思路分析

1、基于度量的程序结构分析

流程时序图(利用SequenceDiagram插件)

注:使用UML Support插件时,采用实现runnable接口的方法生成的类关系图更优美一点

Input类(三次作业复用):

Elevator类:

第一次

 

第二次

图太大了戳这里

第三次

图太大了戳这里

代码行数统计(利用Statistic插件)

第一次

第二次

第三次

代码设计复杂度(利用MetricsReloaded插件)

ev(G)基本复杂度,用来衡量程序非结构化程度
iv(G)模块设计复杂度,用来衡量模块判定结构
v(G)独立路径条数

第一次

第二次

第三次

 

2、BUG分析

第一次:

强测中得分 100

互测:未被hack。未hack别人。

第二次:

在强测中得分 82.558(所有数据性能分几乎为0)

未被hack。未hack到别人。

第三次:

在强测中得分  76.9294(WA两个数据点,其余数据性能分几乎为0)

被hack1次,hack他人1次。

自己错误:出现了电梯容量已满却仍进人的情况。

他人错误:电梯换向时到了21层。

 

三、知识技能总结

1、代码编写层面的优化

1)第三次作业中一种快速处理换乘楼层的写法

记A电梯为001,B电梯为010,C电梯为100.

则可乘坐的电梯的类型可以用三位二进制数来表示,例如:

在1层的人可以乘坐A、B电梯,则建立楼层1到二进制数011的映射(map)。

在3层的人只能乘坐C电梯,则简历楼层3到二进制数100的映射。

这样避免了用八个等待队列储存所有情况的繁杂写法。

 

2)电梯不同状态间的切换:run方法中,用状态机来实现,简单直观

 1     public void run() {
 2         while (true) {
 3             synchronized (this) {
 4                 try {
 5                     if (state == 0) {
 6                         break;
 7                     }
 8                     if (state == 1) { //main request
 9                         while (true) {
10                             if (Singleton.getInstance().isend()) {
11                                 close();
12                                 state = 0;
13                                 break;
14                             }
15                             mainRequest = Singleton.getInstance().getMainRequest();
16                             if (mainRequest == null) {
17                                 synchronized (Singleton.getInstance()) {
18                                     Singleton.getInstance().wait();
19                                 }
20                             } else {
21                                 solveMain();
22                                 break;
23                             }
24                         }
25                     }
26                     else if (state == 2) { solveUp(); } 
27                     else if (state == 3) { solveDown(); }
28                 } catch (InterruptedException e) {
29                     //DO STH
30                 }
31             }
32         }
33     }

 

2、多线程设计模式的实际运用

1)单例模式

2)生产者—消费者模式

3)线程池(Worker Thread模式)

4)观察者模式

3、输出日志信息 Log4j

配置log4j2-test.xml文件:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <configuration status="OFF">
 3     <appenders> <!—输出模块-->
 4         <Console name="Console" target="SYSTEM_OUT">
 5             <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
 6         </Console>
 7     </appenders>
 8     <loggers><!—日志模块-->
 9 <logger name=“elevator.WorkerThread" level="trace" additivity="false">
10             <appender-ref ref="Console"/>
11         </logger>
12         <root level="error">
13             <appender-ref ref="Console"/>
14         </root>
15     </loggers>
16 </configuration>

 

4、JProfiler的使用

5、定点投放的实现

思路:正则表达式分离时间戳+sleep

python程序已上传至GitHub

6、线程安全容器总结

这一单元作业中我采用了CopyOnWriteArrayList作为线程安全数组

COW(Copy On Write)机制的介绍:https://yq.aliyun.com/articles/665359

 

四、自己的一点思考

1、程序测试方法

随机数据测试(测试cpu-time和基本的功能)+构造数据测试(测试电梯是否满足所有限制条件)

对拍器SPJ测试的功能,同时也是构造数据时重点检验的功能:

是否满足到达——开门——出入人——关门的顺序。

是否满足楼层限制

是否满足容量要求

除此之外,三次作业重难点在于:

1)HW5:是否可正常退出线程:接收器不再接收请求,电梯继续处理完已经读入的请求

2)HW6:是否可将所有请求捎带(如果有请求的区间与当前等待队列区间不重合,是否将其放入等待队列?)、同一楼层是否会开关两次门

3)HW7:2->3、4->3的换乘需要特殊处理。换乘指令拆解后是否按顺序执行(在人下电梯后才能从同楼层上另一电梯)。

2、优化方法

四、疑问与建议

1、对拍器的意义?

助教说,A组强测和互测成绩远好于B组和C组的一大原因是“大佬们基本人手一个评测机”。

我承认互测的确是测试的有效手段,这导致我这一单元的最大收获就是学会写得一手好脚本。

但当我发现自己用在写评测机的时间远远大于学习多线程思想的时间的时候,我感觉自己在面向“评测机”编程。

不知道老师和助教为何大力鼓励同学们来写评测机。知识无穷,学什么只要用心了都会有收获,也都会有相应的欢喜和满足。但这种偏离正轨的导向还是会让人感觉食之无味,弃之可惜。

2、架构or性能?

自我感觉第二单元作业的难度要低于第一单元。程序的大体架构老师在课上已经基本讲过,剩下的添添补补,这三次作业竟然没有重构。

如果说性能优化基于架构的话,那性能优化的方向是什么呢?

当我问及性能的问题时,助教和老师都在强调正确性为主,但作为两次被性能分踩死的选手,还是想要了解一下助教出题时构想的优化的可能思路。T_T

3、b站都开源了,大佬们的代码可以开源吗

 如果助教觉得上面的话都没道理的话......我只是想请求看一看大佬们的优秀代码,学习一下。/小纠结

PS. 实验课的题面在结束之后可以开放吗?这样还能复习巩固一下下。

转载于:https://www.cnblogs.com/Ryan0v0/p/10752795.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/449161.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/449161.shtml
英文地址,请注明出处:http://en.pswp.cn/news/449161.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决报错 javax.persistence.TransactionRequiredException: Executing an update/delete query

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 报错如题。 场景是我想要执行一条很简单的删除语句。 JPA方式中使用本地sql , 写法如下&#xff1a; ModifyingQuery("delete fr…

linux基础知识点总结-最实用!(环境搭建,系统分区,常用命令,vim文本)

Linux系统介绍&#xff1a; Linux管理硬盘的能力非常强&#xff0c;所以我们看到的只有一个分区。 / 根目录&#xff0c;所有文件都存储在它下面 /bin 存储着系统命令 /dev 设备文件&#xff08;一切皆文件&#xff09; /home 用户主目录&#xff0c;会自动生成用户同名目录 /…

递归实现进制转换(C++版)

上次呢&#xff0c;我们留下了一道题&#xff0c;今天我们来一起看一看&#xff1a; 题目链接&#xff1a;https://www.cnblogs.com/gaozirong/p/10547434.html 这是我写的程序&#xff0c;大家可以对照参考一下&#xff08;C&#xff09;&#xff1a; #include<bits/stdc.h…

解决 mysql 插入数据报错: Cannot add or update a child row: a foreign key constraint fails

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 场景&#xff1a;我的情况是主表为用户 user 表&#xff0c;从表为职位 job 表&#xff0c;其中 job 表有一个外键为 user 表的主键。 …

犹太人从未透露的12个秘密(图)

中国人喜欢攒钱&#xff0c;西方人热衷花钱&#xff0c;只有犹太人精于赚钱。 他们认为&#xff1a;唯有运用智慧赚钱&#xff0c;才是真正的致富之道。他们的经商智慧风靡全球&#xff0c;造就了无数的商业巨子。本文通过解读犹太人精妙绝伦的经商之道&#xff0c;从人性、道…

vim文本编辑器的配置vimrc

在行底模式下对vim的设置只是临时有效&#xff0c;如果想长期有效需要把这些设置语句写入配置文件(~/.vimrc)中。 打开vim的配置&#xff1a;vim ~/.vimrc 进行编辑&#xff1a; " 显示行号 set number" tab键宽度 set tabstop4" 设置自动缩进 set autoindent…

IDEA 错误:找不到或无法加载主类

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 从昨天开始使用IDEA开始就一直在搭建java环境&#xff0c;许久没有使用过java&#xff0c;刚开始有些生疏&#xff0c;先建了一个最简单…

Android 第一篇

在Android的世界里以一只萌级小菜鸟的身份起飞&#xff0c;在后面的路途中不断的成长。转载于:https://www.cnblogs.com/ming-michelle/p/10558328.html

如何吸引财富呢?请做这六件事吧!

一&#xff1a;投资你的债务 有一则故事到处流传&#xff1a;当声名浪藉的威利被问到为什么要抢劫银行时&#xff0c;他回答道&#xff1a;“因为这里有钱。”威利可能是个恶棍&#xff0c;但不是个笨蛋。他选对了目标。不过如能够到银行里投资&#xff0c;而不是到这里抢劫&am…

vscode解决中文乱码

打开文件时出现乱码 文件->首选项->设置&#xff0c;然后在右边用户设置里打开settings.json &#xff0c;输入&#xff1a; “files.autoGuessEncoding”: true, CtrlS保存一下&#xff0c;就搞定了&#xff01; 没有做很大的修改&#xff0c;可以正常使用就行 {&qu…

Centos 7源码编译搭建Nginx

一、Nginx入门介绍 1. Nginx&#xff08;engine x&#xff09;&#xff1a;[ˈendʒɪnks] 2. Nginx 是 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的&#xff0c;第一个公开版发布于2014年10月4日 3. 主要功能 1&#xff09;HTTP 服务器&#xff08;包含动静分离…

数据备份、pymysql模块

----------mysql数据备份------------- #1. 物理备份&#xff1a; 直接复制数据库文件&#xff0c;适用于大型数据库环境。但不能恢复到异构系统中如Windows。 #2. 逻辑备份&#xff1a; 备份的是建表、建库、插入等操作所执行SQL语句&#xff0c;适用于中小型数据库&#xff0…

优雅的找出ArrayList中重复的元素

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 方法1 代码&#xff1a; public class Main { public static void main(String[] args){ List<String> list new ArrayList&…

全球通吃的九大黄金专业

出国留学的同学在选专业时尤其摇摆不定&#xff0c;选择时需要根据以后的就业发展来挑选适合自己的专业。专业选择得当与否&#xff0c;决定着留学生回国发展是否顺利&#xff0c;决定着巨额投资是否物有所值&#xff0c;以下九类比较有发展潜力的黄金留学专业&#xff0c;供大…

C语言里最基础的关键字

内建类型&#xff1a; void、char、short、int、long、float、double 自建类型&#xff1a; struct、union、enum、sizeof 类型限定符&#xff1a; auto、const、static、volatile、register、extern、typedef、signed、unsigned 分支&#xff1a; if、else、switch、case、def…

mysql 行转列 (结果集以坐标显示)

create table capacity(type int ,numbers int ,monthst INT ); select type, sum(case monthst when 1 then numbers else 0 end ) 一月, sum(case monthst when 2 then numbers else 0 end ) 二月, sum(case monthst when 3 then numbers else 0 end ) 三月, sum(case months…

(五)springcloud微服务分布式云架构 - 云架构代码结构构建

上一篇介绍了《整合spring cloud云服务架构 - 企业分布式微服务云架构图》&#xff0c;本篇我们根据架构图进行代码的构建。根据微服务化设计思想&#xff0c;结合spring cloud一些优秀的项目&#xff0c;如服务发现、治理、配置化管理、路由负载、安全控制等优秀解决方案&…

FastJson 中 jsonArray 转换成 list 集合的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 今天在写代码时候&#xff0c;遇到了需要将json文本改成jsonobject对象&#xff0c;然后将jsonobject对象转换成jsonArray数组&#xff…

信用卡使用十年的心得体会(图)

从第一张信用卡开卡以来&#xff0c;用卡也十多年了。一共用过三家银行的信用卡&#xff0c;分别是&#xff1a;招商银行、建设银行和交通银行。 谈不上用卡达人&#xff0c;只是将自己这十多年的使用体会&#xff0c;分享给大家吧~ 1、可按自己喜好设置还款日期——第一次…

linux命令编译C语言程序

C语言简介&#xff1a; BCPL->newB->C->UNIX->Linux->gcc C语言专门编写操作系统的语言&#xff0c;所以天生适合对硬件编程&#xff0c;也以运行速度快著称&#xff0c;也非常适合实现数据结构和算法。 由于出现时间过早&#xff0c;有很多缺陷&#xff0c;也…