精华内容
下载资源
问答
  • 常用的说明顺序4种
    千次阅读
    2018-09-12 18:16:28

    一、命令说明

    • mmc_go_idle 
      发送CMD0指令,GO_IDLE_STATE 
      使mmc card进入idle state。 
      虽然进入到了Idle State,但是上电复位过程并不一定完成了,这主要靠读取OCR的busy位来判断,而流程归结为下一步。

    • mmc_send_op_cond 
      发送CMD1指令,SEND_OP_COND 
      这里会设置card的工作电压寄存器OCR,并且通过busy位(bit31)来判断card的上电复位过程是否完成,如果没有完成的话需要重复发送。 
      完成之后,mmc card进入ready state。

    • mmc_all_send_cid 
      这里会发送CMD2指令,ALL_SEND_CID 
      广播指令,使card回复对应的CID寄存器的值。在这里就相应获得了CID寄存器的值了,存储在cid中。 
      完成之后,MMC card会进入Identification State。

    • mmc_set_relative_addr 
      发送CMD3指令,SET_RELATIVE_ADDR 
      设置该mmc card的关联地址为card->rca,也就是0x0001 
      完成之后,该MMC card进入standby模式。

    • mmc_send_csd 
      发送CMD9指令,MMC_SEND_CSD 
      要求mmc card发送csd寄存器,存储到card->raw_csd中,也就是原始的csd寄存器的值。 
      此时mmc card还是处于standby state

    • mmc_select_card & mmc_deselect_cards 
      发送CMD7指令,SELECT/DESELECT CARD 
      选择或者断开指定的card 
      这时卡进入transfer state。后续可以通过各种指令进入到receive-data state或者sending-data state依次来进行数据的传输

    • mmc_get_ext_csd 
      发送CMD8指令,SEND_EXT_CSD 
      这里要求处于transfer state的card发送ext_csd寄存器,这里获取之后存放在ext_csd寄存器中 
      这里会使card进入sending-data state,完成之后又退出到transfer state。

    • mmc_switch 
      发送CMD6命令,MMC_SWITCH 
      用于设置ext_csd寄存器的某些bit

    • mmc_send_status 
      发送CMD13命令,MMC_SEND_STATUS 
      要求card发送自己当前的状态寄存器

    • mmc_send_cid 
      发送CMD10命令,MMC_SEND_CID 
      要求mmc card回复cid寄存器

    • mmc_card_sleepawake 
      发送CMD5命令,MMC_SLEEP_AWAKE 
      使card进入或者退出sleep state,由参数决定。

    二、初始化顺序

    1.power up emmc

    2.设置电压,配置阶段为400khz

    3.设置位宽为1bit

    4.cmd0

    5.cmd1循环一直到检测到emmc返回的电源状态稳定

    6.cmd2获取cid

    7.cmd3 设置rca,如果获取到的数值不正确,可以手动设置为0x01

    8.cmd9 获取csd

    9.可以重新配置工作速率

    10.cmd7 设置为transfer mode

    11.cmd8获取额外的csd信息

    12.cmd 16设置block len

    13.cmd6 设置工作bit模式

    14读cmd17.18

    15.写cmd24.25

    三、EMMC的主机配置

    主机的配置最先要注意的就是IO的配置,很多复用的管脚,是否是EMMC的CMD和DATA功能配置

    更多相关内容
  • 关于常用序号的几点说明(数字序号顺序).doc
  • Swagger2常用注解说明

    万次阅读 多人点赞 2020-07-20 23:40:14
    文章目录Swagger2简介使用Swagger解决的问题Spring Boot集成Swagger2添加依赖添加Swagger2Config配置类编写接口用户DTO用户controller访问接口文档Swagger2常用注解说明Controller相关注解@Api接口相关注解@...

    Swagger2简介

    swagger官网 对 swagger 的描述如下:

    Swagger takes the manual work out of API documentation, with a range of solutions for generating, visualizing, and maintaining API docs.

    Simplify API development for users, teams, and enterprises with the Swagger open source and professional toolset.

    Swagger提供了用于生成,可视化和维护API文档的一系列解决方案,从而使API文档不再需要人工操作。

    借助Swagger开源和专业工具集,为用户,团队和企业简化API开发。

    我的总结:Swagger 是一套基于 OpenAPI 规范构建的开源工具,可以帮助我们设计、构建、使用和测试 Rest API。

    使用Swagger解决的问题

    现在大部分公司都采用前后端分离开发的模式,前端和后端工程师各司其职。这就要求有一份及时更新且完整的Rest API 文档来提高工作效率。Swagger 解决的问题主要有以下三点:

    1. 保证文档的时效性:只需要少量的注解,Swagger 就可以根据代码自动生成 API 文档,代码变文档跟着变
    2. 接口请求参数和返回结果不明确的问题
    3. 在线测试接口

    Spring Boot集成Swagger2

    这里通过构建一个简单的Spring Boot项目,并使用Swagger注解,来演示如何使用Swagger

    添加依赖

    这里没有添加springfox-swagger2和springfox-swagger2-ui依赖,而是使用knife4j-spring-boot-starter依赖,官网地址:https://doc.xiaominfo.com/knife4j/

    <!-- 一些校验的依赖,不然启动会报NoClassDefFoundError: javax/validation/constraints/Min -->
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.1.Final</version>
    </dependency>
    
    <!-- Spring Boot单服务架构使用最新版的knife4j依赖,已经继承swagger依赖,同时增强UI实现 -->
    <dependency>
        <groupId>com.github.xiaoymin</groupId>
        <artifactId>knife4j-spring-boot-starter</artifactId>
        <version>2.0.3</version>
    </dependency>
    
    <!-- lombok依赖 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    
    <!-- spring-boot-starter-web依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

    添加Swagger2Config配置类

    注意:RequestHandlerSelectors.basePackage("com.jourwon.springboot.knife4j.controller") 为 Controller 包路径,不然生成的文档扫描不到接口,也可以使用RequestHandlerSelectors.any()配置

    /**
     * Swagger2配置类
     *
     * @author JourWon
     * @date 2020/6/1
     */
    @EnableKnife4j
    @EnableSwagger2
    @Configuration
    @Import(value = {BeanValidatorPluginsConfiguration.class})
    public class Swagger2Config {
    
        @Bean
        public Docket createRestApi() {
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo())
                    .select()
                    .apis(RequestHandlerSelectors.any())
                    .paths(PathSelectors.any())
                    .build();
        }
    
        private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                    // 标题
                    .title("我的Swagger API文档")
                    // 描述
                    .description("使用Knife4j构建API文档")
                    // 作者信息
                    .contact(new Contact("ThinkWon", "https://thinkwon.blog.csdn.net/", "thinkwon@163.com"))
                    // 服务网址
                    .termsOfServiceUrl("https://thinkwon.blog.csdn.net/")
                    // 版本
                    .version("1.0.0")
                    .build();
        }
    
    }
    

    编写接口

    用户DTO

    /**
     * 用户
     *
     * @author JourWon
     * @date 2020/6/1
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ApiModel(value = "用户", description = "查询用户")
    public class UserDTO implements Serializable {
    
        private static final long serialVersionUID = 78806598597025327L;
    
        @ApiModelProperty(value = "用户id")
        private Integer userId;
    
        @ApiModelProperty(value = "用户名")
        private String username;
    
    }
    

    用户controller

    
    /**
     * 用户controller
     *
     * @author JourWon
     * @date 2020/6/1
     */
    @RestController
    @RequestMapping(value = {"/user"})
    @Api(tags = {"用户controller"})
    public class UserController {
    
        private List<UserDTO> list = new ArrayList<>();
    
        @PostConstruct
        private void post() {
            list.add(new UserDTO(1, "JourWon"));
            list.add(new UserDTO(2, "Jobs"));
            list.add(new UserDTO(3, "JackMa"));
        }
    
        @GetMapping("/list")
        @ApiOperation(value = "查询用户列表")
        public List<UserDTO> list() {
            return list;
        }
    
        @GetMapping("/page")
        @ApiOperation(value = "分页查询用户列表")
        @ApiImplicitParams({
                @ApiImplicitParam(name = "pageNum", value = "当前页数"),
                @ApiImplicitParam(name = "pageSize", value = "每页记录数")
        })
        public List<UserDTO> page(
                @RequestParam(defaultValue = "1", required = false) Integer pageNum, @RequestParam(defaultValue = "10", required = false) Integer pageSize) {
            return list;
        }
    
        @GetMapping("/{userId}")
        @ApiOperation(value = "根据用户id查询用户")
        public UserDTO get(@PathVariable("userId") Integer userId) {
            for (UserDTO userDTO : list) {
                if (userDTO.getUserId().equals(userId)) {
                    return userDTO;
                }
            }
            return new UserDTO();
        }
    
        @PostMapping
        @ApiOperation(value = "新增用户")
        public Boolean insert(@RequestBody @ApiParam(name = "UserDTO", value = "新增用户参数") UserDTO userDTO) {
            list.add(userDTO);
            return true;
        }
    
        @DeleteMapping("/{userId}")
        @ApiOperation(value = "根据用户id删除用户")
        public Boolean delete(@PathVariable("userId") Integer userId) {
            Iterator<UserDTO> iterator = list.iterator();
            while (iterator.hasNext()) {
                if (iterator.next().getUserId().equals(userId)) {
                    iterator.remove();
                    return true;
                }
            }
            return false;
        }
    
        @PutMapping
        @ApiOperation(value = "更新用户信息")
        @ApiResponses({
                @ApiResponse(code = 400, message = "请求参数没填好"),
                @ApiResponse(code = 404, message = "请求路径没有或页面跳转路径不对")
        })
        public Boolean update(@RequestBody @ApiParam(name = "UserDTO", value = "更新用户参数") UserDTO userDTO) {
            Iterator<UserDTO> iterator = list.iterator();
            while (iterator.hasNext()) {
                UserDTO next = iterator.next();
                if (next.getUserId().equals(userDTO.getUserId())) {
                    next.setUsername(userDTO.getUsername());
                    return true;
                }
            }
            return false;
        }
    
    }
    

    这个controller有了六个接口,分别是:

    1. /user/list,get请求方式:查询用户列表
    2. /user/page,get请求方式:分页查询用户列表
    3. /user/{userId},get请求方式:根据用户id查询用户
    4. /user,post请求方式:新增用户
    5. /user,put请求方式:更新用户信息
    6. /user/{userId},delete请求方式:根据用户id删除用户

    访问接口文档

    启动一下项目,然后在浏览器中访问 http://localhost:8080/doc.html

    主页展示API文档基本信息,包括简介,作者,版本等信息

    在这里插入图片描述

    同时可以看到用户controller的所有接口

    在这里插入图片描述

    这里我们调试以下查询用户列表的接口

    在这里插入图片描述

    至此,Spring Boot集成Swagger2,构建API文档已经完成

    Swagger2常用注解说明

    Controller相关注解

    @Api

    用在请求的类上,表示对类的说明

    注解属性类型描述
    tagsString[]描述请求类的作用,非空时会覆盖value的值
    valueString描述请求类的作用
    非常用参数
    producesString设置 MIME 类型列表(output),例:“application/json, application/xml”,默认为空
    consumesString设置 MIME 类型列表(input),例:“application/json, application/xml”,默认为空
    protocolsString设置特定协议,例:http, https, ws, wss
    authorizationsAuthorization[]获取授权列表(安全声明),如果未设置,则返回一个空的授权值
    hiddenboolean默认为 false,配置为 true 将在文档中隐藏
    descriptionString对 api 资源的描述,在 1.5 版本后不再支持
    basePathString基本路径可以不配置,在 1.5 版本后不再支持
    positionint如果配置多个 Api 想改变显示的顺序位置,在 1.5 版本后不再支持

    示例

    @Api(tags = {"用户controller"})
    public class UserController {}
    

    接口相关注解

    @ApiOperation

    用在请求类的方法上,说明方法的用途和作用

    注解属性类型描述
    valueString方法的简要说明
    notesString方法的备注说明
    非常用参数
    tagsString[]操作标签,非空时将覆盖value的值
    responseClass<?>响应类型(即返回对象)
    responseContainerString声明包装的响应容器(返回对象类型)。有效值为 “List”, “Set” or “Map”
    responseReferenceString指定对响应类型的引用。将覆盖任何指定的response()类
    httpMethodString指定HTTP方法,“GET”, “HEAD”, “POST”, “PUT”, “DELETE”, “OPTIONS” and “PATCH”
    positionint如果配置多个 Api 想改变显示的顺序位置,在 1.5 版本后不再支持
    nicknameString第三方工具唯一标识,默认为空
    responseHeadersResponseHeader[]响应头列表
    codeint响应的HTTP状态代码。默认 200
    extensionsExtension[]扩展属性列表数组
    producesString设置 MIME 类型列表(output),例:“application/json, application/xml”,默认为空
    consumesString设置 MIME 类型列表(input),例:“application/json, application/xml”,默认为空
    protocolsString设置特定协议,例:http, https, ws, wss
    authorizationsAuthorization[]获取授权列表(安全声明),如果未设置,则返回一个空的授权值
    hiddenboolean默认为 false,配置为 true 将在文档中隐藏

    示例

    @GetMapping("/list")
    @ApiOperation(value = "查询用户列表")
    public List<UserDTO> list() {
        return list;
    }
    

    @ApiParam

    可用在方法,参数和字段上,一般用在请求体参数上,描述请求体信息

    注解属性类型描述
    nameString参数名称,参数名称可以覆盖方法参数名称,路径参数必须与方法参数一致
    valueString参数的简要说明
    requiredboolean参数是否必须传,默认为 false (路径参数必填)
    defaultValueString参数的默认值
    非常用参数
    allowableValuesString限制参数的可接受值。1.以逗号分隔的列表 2.范围值 3.设置最小值/最大值
    accessString允许从API文档中过滤参数
    allowMultipleboolean指定参数是否可以通过具有多个事件接受多个值,默认为 false
    exampleString单个示例
    examplesExample参数示例。仅适用于 BodyParameters
    hiddenboolean默认为 false,配置为 true 将在文档中隐藏
    @PostMapping
    @ApiOperation(value = "新增用户")
    public Boolean insert(@RequestBody @ApiParam(name = "UserDTO", value = "新增用户参数") UserDTO userDTO) {
        list.add(userDTO);
        return true;
    }
    

    @ApiImplicitParams

    用在请求的方法上,表示一组参数说明,里面是@ApiImplicitParam列表

    @ApiImplicitParam

    用在 @ApiImplicitParams 注解中,一个请求参数的说明

    注解属性类型描述
    nameString参数名称,参数名称可以覆盖方法参数名称,路径参数必须与方法参数一致
    valueString参数的说明、解释
    requiredboolean参数是否必须传,默认为 false (路径参数必填)
    paramTypeString参数的位置,header 请求参数的获取:@RequestHeader;query 请求参数的获取:@RequestParam;path(用于 restful 接口)–> 请求参数的获取:@PathVariable;body(不常用);form(不常用)
    dataTypeString参数类型,默认 String,其它值 dataType=“Integer”
    defaultValueString参数的默认值
    非常用参数
    allowableValuesString限制参数的可接受值。1.以逗号分隔的列表 2.范围值 3.设置最小值/最大值
    accessString允许从API文档中过滤参数
    allowMultipleboolean指定参数是否可以通过具有多个事件接受多个值,默认为 false
    exampleString单个示例
    examplesExample参数示例。仅适用于 BodyParameters
    @GetMapping("/page")
    @ApiOperation(value = "分页查询问题列表")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "pageNum", value = "当前页数"),
        @ApiImplicitParam(name = "pageSize", value = "每页记录数")
    })
    public List<UserDTO> page(
        @RequestParam(defaultValue = "1", required = false) Integer pageNum, @RequestParam(defaultValue = "10", required = false) Integer pageSize) {
        return list;
    }
    

    @ApiResponses

    用在请求的方法上,表示一组响应

    @ApiResponse

    用在 @ApiResponses 中,一般用于表达一个错误的响应信息

    注解属性类型描述
    codeint响应状态码
    messageString信息,例如 “请求参数没填好”
    responseClass<?>抛出异常的类

    示例

    @PutMapping
    @ApiOperation(value = "更新用户信息")
    @ApiResponses({
        @ApiResponse(code = 400, message = "请求参数没填好"),
        @ApiResponse(code = 404, message = "请求路径没有或页面跳转路径不对")
    })
    public Boolean update(@RequestBody @ApiParam(name = "UserDTO", value = "更新用户参数") UserDTO userDTO) {}
    

    Model相关注解

    @ApiModel

    用在实体类(模型)上,表示相关实体的描述。

    注解属性类型描述
    valueString模型的备用名称
    descriptionString该类的详细说明

    示例

    @ApiModel(value = "用户", description = "查询用户")
    public class UserDTO implements Serializable
    

    @ApiModelProperty

    用在实体类属性上,表示属性的相关描述。

    注解属性类型描述
    valueString属性简要描述
    nameString重写属性名称
    dataTypeStirng重写属性类型
    requiredboolean参数是否必传,默认为 false
    exampleStirng属性示例
    非常用参数
    hiddenboolean是否在文档中隐藏该属性,默认false
    allowEmptyValueboolean是否允许为空,默认false
    allowableValuesString限制参数的可接受值。1.以逗号分隔的列表 2.范围值 3.设置最小值/最大值
    readOnlyboolean将属性设定为只读,默认false
    referenceString指定对相应类型定义的引用,覆盖指定的任何参数值

    示例

    @ApiModelProperty(value = "用户id")
    private Integer userId;
    
    @ApiModelProperty(value = "用户名")
    private String username;
    
    展开全文
  • 4种常用线程池介绍

    万次阅读 多人点赞 2018-05-09 14:58:52
    2. 具体的4种常用的线程池实现如下:(返回值都是ExecutorService)  2.1 Executors.newCacheThreadPool():可缓存线程池,先查看池中有没有以前建立的线程,如果有,就直接使用。如果没有,就建一个新的线程...

    一. 线程池简介

    1. 线程池的概念:

              线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。

    2. 线程池的工作机制

             2.1 在线程池的编程模式下,任务是提交给整个线程池,而不是直接提交给某个线程,线程池在拿到任务后,就在内部寻找是否有空闲的线程,如果有,则将任务交给某个空闲的线程。

             2.1 一个线程同时只能执行一个任务,但可以同时向一个线程池提交多个任务。

    3. 使用线程池的原因:

            多线程运行时间,系统不断的启动和关闭新线程,成本非常高,会过渡消耗系统资源,以及过渡切换线程的危险,从而可能导致系统资源的崩溃。这时,线程池就是最好的选择了。

    二. 四种常见的线程池详解

    1. 线程池的返回值ExecutorService简介:

             ExecutorService是Java提供的用于管理线程池的接口。该接口的两个作用:控制线程数量和重用线程

    2. 具体的4种常用的线程池实现如下:(返回值都是ExecutorService)

             2.1 Executors.newCacheThreadPool():可缓存线程池,先查看池中有没有以前建立的线程,如果有,就直接使用。如果没有,就建一个新的线程加入池中,缓存型池子通常用于执行一些生存期很短的异步型任务

             示例代码:

    复制代码
     1 package com.study.test;
     2 
     3 import java.util.concurrent.ExecutorService;
     4 import java.util.concurrent.Executors;
     5 
     6 public class ThreadPoolExecutorTest {
     7     public static void main(String[] args) {
     8         //创建一个可缓存线程池
     9         ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
    10         for (int i = 0; i < 10; i++) {
    11             try {
    12                 //sleep可明显看到使用的是线程池里面以前的线程,没有创建新的线程
    13                 Thread.sleep(1000);
    14             } catch (InterruptedException e) {
    15                 e.printStackTrace();
    16             }
    17             cachedThreadPool.execute(new Runnable() {
    18                 public void run() {
    19                     //打印正在执行的缓存线程信息
    20                     System.out.println(Thread.currentThread().getName()+"正在被执行");
    21                 }
    22             });
    23         }
    24     }
    25 }
    复制代码

    输出结果:

    pool-1-thread-1正在被执行
    pool-1-thread-1正在被执行
    pool-1-thread-1正在被执行
    pool-1-thread-1正在被执行
    pool-1-thread-1正在被执行
    pool-1-thread-1正在被执行
    pool-1-thread-1正在被执行
    pool-1-thread-1正在被执行
    pool-1-thread-1正在被执行
    pool-1-thread-1正在被执行

    线程池为无限大,当执行当前任务时上一个任务已经完成,会复用执行上一个任务的线程,而不用每次新建线程

           2.2  Executors.newFixedThreadPool(int n):创建一个可重用固定个数的线程池,以共享的无界队列方式来运行这些线程。

             示例代码:

    复制代码
     1 package com.study.test;
     2 
     3 import java.util.concurrent.ExecutorService;
     4 import java.util.concurrent.Executors;
     5 
     6 public class ThreadPoolExecutorTest {
     7     public static void main(String[] args) {
     8         //创建一个可重用固定个数的线程池
     9         ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
    10         for (int i = 0; i < 10; i++) {
    11             fixedThreadPool.execute(new Runnable() {
    12                 public void run() {
    13                     try {
    14                         //打印正在执行的缓存线程信息
    15                         System.out.println(Thread.currentThread().getName()+"正在被执行");
    16                         Thread.sleep(2000);
    17                     } catch (InterruptedException e) {
    18                         e.printStackTrace();
    19                     }
    20                 }
    21             });
    22         }
    23     }
    24 }
    复制代码

    输出结果:

    pool-1-thread-1正在被执行
    pool-1-thread-2正在被执行
    pool-1-thread-3正在被执行
    pool-1-thread-1正在被执行
    pool-1-thread-2正在被执行
    pool-1-thread-3正在被执行
    pool-1-thread-1正在被执行
    pool-1-thread-2正在被执行
    pool-1-thread-3正在被执行
    pool-1-thread-1正在被执行

    因为线程池大小为3,每个任务输出打印结果后sleep 2秒,所以每两秒打印3个结果。
    定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()

           2.3  Executors.newScheduledThreadPool(int n):创建一个定长线程池,支持定时及周期性任务执行

                 延迟执行示例代码:

    复制代码
     1 package com.study.test;
     2 
     3 import java.util.concurrent.Executors;
     4 import java.util.concurrent.ScheduledExecutorService;
     5 import java.util.concurrent.TimeUnit;
     6 
     7 public class ThreadPoolExecutorTest {
     8     public static void main(String[] args) {
     9         //创建一个定长线程池,支持定时及周期性任务执行——延迟执行
    10         ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
    11         //延迟1秒执行
    12         scheduledThreadPool.schedule(new Runnable() {
    13             public void run() {
    14                 System.out.println("延迟1秒执行");
    15             }
    16         }, 1, TimeUnit.SECONDS);
    17     }
    18 }
    复制代码

    输出结果:延迟1秒执行

                 定期执行示例代码:

    复制代码
     1 package com.study.test;
     2 
     3 import java.util.concurrent.Executors;
     4 import java.util.concurrent.ScheduledExecutorService;
     5 import java.util.concurrent.TimeUnit;
     6 
     7 public class ThreadPoolExecutorTest {
     8     public static void main(String[] args) {
     9         //创建一个定长线程池,支持定时及周期性任务执行——定期执行
    10         ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
    11         //延迟1秒后每3秒执行一次
    12         scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
    13             public void run() {
    14                 System.out.println("延迟1秒后每3秒执行一次");
    15             }
    16         }, 1, 3, TimeUnit.SECONDS);
    17     }
    18 }
    复制代码

    输出结果:

    延迟1秒后每3秒执行一次
    延迟1秒后每3秒执行一次
    .............

            2.4  Executors.newSingleThreadExecutor():创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

                   示例代码: 

    复制代码
     1 package com.study.test;
     2 
     3 import java.util.concurrent.ExecutorService;
     4 import java.util.concurrent.Executors;
     5 
     6 public class TestThreadPoolExecutor {
     7     public static void main(String[] args) {
     8         //创建一个单线程化的线程池
     9         ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
    10         for (int i = 0; i < 10; i++) {
    11             final int index = i;
    12             singleThreadExecutor.execute(new Runnable() {
    13                 public void run() {
    14                     try {
    15                         //结果依次输出,相当于顺序执行各个任务
    16                         System.out.println(Thread.currentThread().getName()+"正在被执行,打印的值是:"+index);
    17                         Thread.sleep(1000);
    18                     } catch (InterruptedException e) {
    19                         e.printStackTrace();
    20                     }
    21                 }
    22             });
    23         }
    24     }
    25 }
    复制代码

    输出结果:

    pool-1-thread-1正在被执行,打印的值是:0
    pool-1-thread-1正在被执行,打印的值是:1
    pool-1-thread-1正在被执行,打印的值是:2
    pool-1-thread-1正在被执行,打印的值是:3
    pool-1-thread-1正在被执行,打印的值是:4
    pool-1-thread-1正在被执行,打印的值是:5
    pool-1-thread-1正在被执行,打印的值是:6
    pool-1-thread-1正在被执行,打印的值是:7
    pool-1-thread-1正在被执行,打印的值是:8
    pool-1-thread-1正在被执行,打印的值是:9

    三. 缓冲队列BlockingQueue和自定义线程池ThreadPoolExecutor

    1. 缓冲队列BlockingQueue简介:

              BlockingQueue是双缓冲队列。BlockingQueue内部使用两条队列,允许两个线程同时向队列一个存储,一个取出操作。在保证并发安全的同时,提高了队列的存取效率。

    2. 常用的几种BlockingQueue:

    • ArrayBlockingQueue(int i):规定大小的BlockingQueue,其构造必须指定大小。其所含的对象是FIFO顺序排序的。

    • LinkedBlockingQueue()或者(int i):大小不固定的BlockingQueue,若其构造时指定大小,生成的BlockingQueue有大小限制,不指定大小,其大小有Integer.MAX_VALUE来决定。其所含的对象是FIFO顺序排序的。

    • PriorityBlockingQueue()或者(int i):类似于LinkedBlockingQueue,但是其所含对象的排序不是FIFO,而是依据对象的自然顺序或者构造函数的Comparator决定。

    • SynchronizedQueue():特殊的BlockingQueue,对其的操作必须是放和取交替完成。

    3. 自定义线程池(ThreadPoolExecutor和BlockingQueue连用):

         自定义线程池,可以用ThreadPoolExecutor类创建,它有多个构造方法来创建线程池。

        常见的构造函数:ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)

         示例代码:

    复制代码
     1 package com.study.test;
     2 
     3 import java.util.concurrent.ArrayBlockingQueue;
     4 import java.util.concurrent.BlockingQueue;
     5 import java.util.concurrent.ThreadPoolExecutor;
     6 import java.util.concurrent.TimeUnit;
     7 
     8 class TempThread implements Runnable {
     9 
    10     @Override
    11     public void run() {
    12         // 打印正在执行的缓存线程信息
    13         System.out.println(Thread.currentThread().getName() + "正在被执行");
    14         try {
    15             // sleep一秒保证3个任务在分别在3个线程上执行
    16             Thread.sleep(1000);
    17         } catch (InterruptedException e) {
    18             e.printStackTrace();
    19         }
    20     }
    21 
    22 }
    23 
    24 public class TestThreadPoolExecutor {
    25     public static void main(String[] args) {
    26         // 创建数组型缓冲等待队列
    27         BlockingQueue<Runnable> bq = new ArrayBlockingQueue<Runnable>(10);
    28         // ThreadPoolExecutor:创建自定义线程池,池中保存的线程数为3,允许最大的线程数为6
    29         ThreadPoolExecutor tpe = new ThreadPoolExecutor(3, 6, 50, TimeUnit.MILLISECONDS, bq);
    30 
    31         // 创建3个任务
    32         Runnable t1 = new TempThread();
    33         Runnable t2 = new TempThread();
    34         Runnable t3 = new TempThread();
    35         // Runnable t4 = new TempThread();
    36         // Runnable t5 = new TempThread();
    37         // Runnable t6 = new TempThread();
    38 
    39         // 3个任务在分别在3个线程上执行
    40         tpe.execute(t1);
    41         tpe.execute(t2);
    42         tpe.execute(t3);
    43         // tpe.execute(t4);
    44         // tpe.execute(t5);
    45         // tpe.execute(t6);
    46 
    47         // 关闭自定义线程池
    48         tpe.shutdown();
    49     }
    50 }
    复制代码

    输出结果:

    pool-1-thread-1正在被执行
    pool-1-thread-2正在被执行
    pool-1-thread-3正在被执行

    展开全文
  •  序号Sequence Number,有顺序的号码,如数字序号:1、2、3……,大写汉字也算数字序号,如:一、二、三……序号可以清晰的分清同一类事物,也可以用序号作文章的小标题。我们在写文章,特别是在写论文中经常会用...

     

    一.序号

      序号Sequence Number,有顺序的号码,如数字序号:1、2、3……,大写汉字也算数字序号,如:一、二、三……序号可以清晰的分清同一类事物,也可以用序号作文章的小标题。我们在写文章,特别是在写论文中经常会用一些数字序号,正确地运用序号,能使我们的文章层次清楚,逻辑分明,便于读者阅读和引述;目前较多论文在序号的写法上存在着不少的误区,如:层次大小不分、中文数字与阿拉伯数字混用、前后序号形式不统一,等等。用得不好,让人看着别扭,甚至会影响文章的质量,可见序号也是文章的一个重要组成部分,它的规范与否同样很重要。在评选论文时,常常会为一些文章感到惋惜,内容、文字很精彩,可数字序号的运用不规范或者混乱,让人看着不舒服。正文层次标题序号要注意大小分级,为此,我根据自己的使用习惯,并参考一些资料,在此谈谈有关数字序号的用法,对序号规范写法作一详细说明:

    、序号的结构层次顺序

    (一)数字序号的级别顺序为:

    第一层为汉字数字加顿号,例如:“一、”“二、”“三、”;

    第二层为括号中包含汉字数字,例如:“(一)”“(二)”“(三)”;

    第三层为阿拉伯数字加下脚点,例如:“1. ”“2.”“3.”;

    第四层为括号中包含阿拉伯数字,例如:“(1)”“(2)”“(3)”;

    第五层为带圈的阿拉伯数字,例如:“①”“②”“③”或者“1)”“2)”“3)”;

    第六层为大写英文字母,例如:“A.”“B.”“C.”或者“(A)”“(B)”“(C)”;

    第七层为小写英文字母,例如: “a.”“b.”“c.”或者“(a)”“(b)”“(c)”;

    ……

    数字序号级别一览表:

    第一层

    第二层

    第三层

    第四层

    第五层

    第六层

    第七层

    一、

    (一)

    1.

    (1)

    A.

    a.

    二、

    (二)

    2.

    (2)

    B.

    b.

    三、

    (三)

    3.

    (3)

    C.

    c.

     

     

     

     

     

    (A)

    (a)

     

     

     

     

     

    (B)

    (b)

     

     

     

     

     

    (C)

    (c)

     

     

    第一,

     

     

     

     

     

     

    第二,

     

     

     

     

     

     

    首先,

     

     

     

     

     

     

    其次,

     

     

     

     

    (二)理科类论文的正文层次标题序号

    理科类论文的各层次标题还可用阿拉伯数字连续编码,不同层次的2个数字之间用下圆点(.)分隔开,末位数字后面不加点号。如“1”,“1.2”,“1.2.1”等;各层次的标题序号均左顶格排写,最后一个序号之后空一个字距接排标题。如“5.3.2 测量的方法”,表示第五章第三节第二条的标题是“测量的方法”。

    注意:同一层次各段内容是否列标题应一致,各层次的下一级序号标法应一致,若层次较少可不用若干加括号的序号。

    (三)正文中图、表、公式、算式等的序号

    正文中的图、表、公式、算式等序号一律用阿拉伯数字分别依序连续编排序号,其标注形式应便于互相区别,如“图1、表2、式(5)”等;对长篇研究报告也可以分章(条)依序编码,如“图2.1、表4.2、式(3.3)”等,其前一个数字表示章(条)序号,后一个数字表示本章中图表、公式的序号。

    、文字材料中序号、标点的正确使用

    (一)“第一”、“第二”、“第三”或“首先”、“其次”等后面用顿号不规范,应该用逗号“,”,即“第一,”、“第二,”、“第三,”、“首先,”、“其次,”等。

    (二)“第一编”、“第一章”、“第一节”或“壹”的后面不用标点,与后面的文字之间空一个汉字位置即可。如“第一节 测量的方法”。

        (三)汉字数字“一”、“二”、“三”等后面用逗号不规范,应该用顿号“、”,即“一、”、“二、”、“三、”。

        (四)阿拉伯数字“1”、“2”、“3”和“A”、“B”、“C”等后面用顿号(“、”)或其它不规范,应该使用齐线墨点(实心小圆点“.”),即“ 1.”、“ 2.”、“ 3.” 或“ A.”、“ B.”、“ C.”。

    (五)带括号的序号和带圆圈的序号,如(一)(二)(三)、(1)(2)(3)、①②③等后面不再加顿号、逗号之类的标点符号。

    (六)用“一是”、“二是”、“三是”表示顺序时,可在“一是”、“二是”、“三是”之后分别用逗号。例如:“一是,”、“二是,”、“三是,”。也可以不用标点符号,直接连接下文。

    (七)用“甲”、“乙”、“丙”、“丁”表示顺序时,在“甲”、“乙”、“丙”、“丁”之后分别用顿号“、”。例如:“甲、”,“乙、”,“丙、”,“丁、”。

    (八)在“一方面”、“另一方面”之后,可以分别用逗号,也可以不用标点符号,直接连接下文。

    (九)数字序号前后一般不再用其他项目符号。

    、年份的正确书写

    (一)年份中“零”的正确使用:

    年份如用中文形式表示,如“二○○九年十月五日”,则中间的汉字数字“○”不能写成阿拉伯数字的长“0”或英语全角字符“O”,而应该用圆“○”(一般在电脑“插入”栏里“特殊符号”或“几何图形符”中选择)。“二○○九”是一串没有数位的数字,要用“○”,不宜用“零” ,例如公文中的错误写法:“二零零九”。“零”用于出现数位的一串汉字数字中,例如“三千一百零六”中,出现了数位“千”、“百”,此时应当用“零”。

    年份如用阿拉伯数字形式表示,则中间应该用长“0”表示,例如:“2009年10月5日”。但对于公文文末成文时间书写规范又有要求:《国家行政机关公文处理办法》(国务院国发〔2000〕23号)规定,公文文末的成文时间要用汉字数字来书写。例如:“2008年12月28日”应当写成“二○○八年十二月二十八日”。

    (二)公文的年份中“括号”的正确使用:

    《国家行政机关公文格式》(GB/T 9704—1999)规定,公文发文字号中的年分要写在六角括号内,而不应该用小括号“( )”或方括号“[ ]”。

    例如:潍教办字(2005)5号(不规范)

    潍教办字 [2005] 5号(不规范)

    潍教办字[2005]5号(不规范)

    潍教办字〔2005〕5号(规范)

    、汉语拼音注音字母的正确使用

    (一)大小写:句子的首字母大写;诗行的首字母大写;专有名词每个词首字母大字;标题、标语可以全部大写。

    (二)分连写:词内连写,词间分写。

    例如:“公共场所请勿吸烟”      GONG GONG CHANG SUO QING WU XI YAN(不规范)

     GONGGONG CHANGSUO QINGWU XIYAN(规范)

    例如:“中国井冈山经贸洽谈会”  ZHONGGUOJINGGANGSHANJINGMAOQIATANHUI(不规范)

     ZHONGGUO JINGGANGSHAN JINGMAO QIATANHUI(规范)

    、正确区分连接号和破折号

     (一)凡文中使用连接号的应使用“~”,而不使用“——”或者“―”。

    如:2008年3月~4月中的“~”(使用规范),而不使用“——”或者“―”。

     (二)凡文中使用破折号的应使用占两个空格的连线“——”,而不用“~”或只占一个空格的短线“―”或两个短线“――”表示。

    如:再接再厉,推进语言文字规范化工作——2009年语言文字工作总结(选取破折号,一般在电脑“插入”栏“标点符号”中查找)。

    、相邻的两个数字间顿号的使用

    (一)相邻的两个数字表示概数,要用汉字数码,中间也不要加顿号。

    例如:2、3个  5、6天   27、8岁   6、7点钟  (不规范)

    两三个   五六天   二十七八岁   六七点钟  (规范)

    (二)相邻两个数字连用,有时不是表示概数,而是一种缩略形式,中间要用顿号。

    例如:初中一、二年级    国棉六、七厂    八、九两个月    退居二、三线(规范)

    、文章正文文中标题

    一级标题:标题序号为“一、”,独占行,末尾不加标点;

    二级标题:标题序号为“(一)”,与正文字体字号相同,独占行,末尾不加标点符号;

    三级以下标题:三、四、五级标题序号分别为“1.”、“(1)”和“①”,与正文字体字号相同,可根据标题的长短确定是否独占行。若独占行,则末尾不使用标点;否则,标题后必须加句号。每级标题的下一级标题应各自连续编号。

    、注释和参考文献的序号

    文中注释极少量的可用“*”、“**”表示,一般用圆圈的阿拉伯数字依序标注,如“①、②、③……”,标在所注对象的右上角。页脚或文末注释中对于相同内容的注释条目可合并写,如“⑥⑨马斯洛,《存在心理学探索》,昆明:云南人民出版社,1987年,130、126页”。

    参考文献的序号标注一般用方括号的阿拉伯数字,如“[1]、[2]、[3]……”,也有不加括号的。文末参考文献与文中内容对应的,应在相应文字的右上角依序标出序号。

    、附录序号

    论文的附录序号一般用大写英文字母标示,如“附录A、附录B、附录C……”。附录中的图、表、式、参考文献等另行编序号,与正文分开,也一律用阿拉伯数字编码,但在数码前冠以附录序码,如:图A1、表B2、式(C3)、文献[D4]等。

    十一、页码序号

    页码标注由正文的首页开始,作为第1页,可以标注在页眉或页脚的中间或右边。封面、封二、封三和封底不编入页码。可以将扉页、序、目次页等前置部分单独编排页码。各页页码应标注在相同位置。

     

    十二常见不规范之序号有:

    1、

    A、

    (一)、

    (1)、

    ①、

    第一:

    第一、

    2、

    B、

    (二)、

    (2)、

    ②、

    第二:

    第二、

    3、

    C、

    (三)、

    (3)、

    ③、

    第三:

    第三、

    规范的序号用法如下:

    1.

    A.

    (一)

    (1)

    第一,

    首先,

    2.

    B.

    (二)

    (2)

    第二,

    其次,

    3.

    C.

    (三)

    (3)

    第三,

    再次,

    转载于:https://www.cnblogs.com/zhangj95/p/5020357.html

    展开全文
  • VHDL的顺序语句

    千次阅读 2021-05-30 15:23:18
    VHDL语言支持的并行语句主要有以下几: 赋值语句 wait语句 after语句 if语句 case语句 null语句 loop语句 exit语句 next语句 assertion/report语句 return语句 顺序语句在VHDL程序中的位置 顺序语句只出现在
  • sql优化常用的几方法

    千次阅读 多人点赞 2022-03-06 05:45:01
    extra列,详细说明。注意,常见的不太友好的值,如下:Using filesort,Using temporary。 2.SQL语句中IN包含的值不应过多 MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好
  • Phoenix常用函数列举及说明

    千次阅读 2019-04-21 12:17:06
    说明 AVG ( numericTerm ) 计算平均值 COUNT (Term) 计算term的总数 COUNT (DISTINCT Term) 去重求总数 MAX ( term ) 求最大值 MIN ( term ) 求最小值 SUM ( ...
  • 直接上代码,代码中有详细注释,请自己领悟#...#include <stdlib.h>#define MAXLEN 100 //定义顺序表的最大长度typedef struct { char key[10]; //结点的关键字 char name[20]; int age; } DATA; //定义结点类型ty
  • 文章章节常用序号编排(数字序号顺序

    万次阅读 多人点赞 2019-12-05 16:42:33
    因为一直觉得自己的文章序号很乱,遂在网上找了篇序号说明文档,以后自己写的文章将参照此标准。 一、序号 序号Sequence Number,有顺序的号码,如数字序号:1、2、3……,大写汉字也算数字序号,如:一、二、三……...
  • JBPM4 常用表结构及其说明

    万次阅读 热门讨论 2014-06-16 17:31:53
    JBPM4 常用表结构 第一部分:表结构说明 Jbpm4 共有18张表,如下,其中红色的表为经常使用的表   一:资源库与运行时表结构 1. JBPM4_DEPLOYMENT 流程定义表 2. JBPM4_...
  • 交互图有顺序图和协作图两形式。 时序图中描述对象按照时间顺序的消息交换。协作图着重描述系统成分如何协同工作。 时序图和协作图从不同角度表达了系统中的交互和系统行为,它们之间可以相互转化
  • 顺序表详解

    千次阅读 2022-04-24 12:01:40
    目录 一、线性表的概念 二、顺序表 1、顺序表的概念 1). 静态顺序表:使用定长数组存储元素。... 【百度百科】 线性表是最基本、最简单、也是最常用的一数据结构。线性表(linear list)是...
  • 家里网线的接法和顺序

    千次阅读 2020-12-21 11:12:36
    对于网线,大伙都熟悉吧,它是电脑连接时必不可少的一设备。但是许多网友却和小编一样,不知道如何连接网线,导致电脑无法上网,下面我们就来详细介绍一下:如何接网线以及家里网线的接法和顺序?希望可以帮助到...
  • 种常用的UML图总结

    千次阅读 多人点赞 2021-06-26 15:33:45
    .前言 准备之后写一些设计模式的笔记,在这里先记录一下前置知识。...UML是在开发阶段,说明、可视化、构建和书写一个面向对象软件密集系统的制品的开放方法。最佳的应用是工程实践,对大规模,复杂系统进行建
  • FANUC常用参数说明

    千次阅读 2020-12-31 08:58:34
    包括运行速度,到位宽度,加减速时间...表2常用参数说明参数含义FS-OIMA/MBFS-OI-Mate-MBFS-16/18/21MFS-16I/18I/21IMFS-OITA/TBFS-OI-Mate-TBFS-16/18/21TFS-16I/18I/21ITPM-O备注(一般设定值)程序输出格式为ISO代...
  • 黑盒测试9种常用方法

    万次阅读 多人点赞 2020-10-29 10:01:40
    (覆盖任意2个因素所有状态的测试用例集合) 例 如果完全组合,其组合数是3 x 4 x 4 x 3 = 144,但如果采用两两组合,其组合数只有17项 可以靠工具自动生成组合,典型有微软的PICT。 正交实验法 Orthogonal Test ...
  • wow常用宏及说明

    千次阅读 多人点赞 2019-09-11 17:02:17
    常用宏及说明 施放法术与物品使用 命令 说明 举例 /cast 施放法术 /cast 变形术 /p 我羊了%t!谁打谁扛着哈! /aftercast 在某技能后执行一条宏命令 /aftercast /p 请队友点门,把懒猪%t揪过来! /cast ...
  • 目录一、数据结构1.1 算法与数据结构的区别二、顺序表2.1 顺序表的基本形式【重点】2.2 顺序表的两基本实现方式【重点】1、一体式结构:2、分离式结构:2.3 元素存储区替换与扩充1. 元素存储区的替换2. 元素存储区...
  • sql优化常用的几方法,19最有效的sql优化技巧 本文我们来谈谈项目中常用的MySQL优化方法,共19条,具体如下: 1、EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划。 下面来个简单的示例,标注(1...
  • 浅谈《软件工程》常用的几软件开发方法

    千次阅读 热门讨论 2020-10-06 21:27:12
    目前常用的开发方法有四,分别是结构化方法、原型法和面向对象方法。接下来我们会一一叙述这些软件开发方法的实现过程和其中的特点以及优缺点。 结构化方法 结构化方法:结构化方法是应用最为广泛的一开发...
  • SpringBoot配置加载顺序

    千次阅读 2022-05-19 22:07:04
    文章目录前言一、Spring Boot 配置优先级二、命令行参数示例 1配置文件示例 2三、示例分析 ...以下是常用的 Spring Boot 配置形式及其加载顺序(优先级由高到低): 命令行参数 来自 java:comp/env 的 JNDI
  • 图解顺序表+单链表

    千次阅读 2021-11-06 13:26:01
    文章目录一 图解顺序顺序表的概念顺序表的实现1 抽象对应的类2 类的方法去实现顺序表2.1 顺序表的打印2.2 顺序表的新增元素2.3判定是否包含某个元素2.4 获取顺序表的长度2.5 查找某个元素对应的位置2.6 获取pos...
  • UML学习笔记——顺序图(时序图)

    千次阅读 2020-12-20 17:45:23
    文章目录顺序图(时序图)顺序图的引入顺序图的概念顺序图的组成①对象( Object)②生命线( Lifeline )③激活(Activation) (控制焦点focus of control)④消息(Message)消息的表示和分类调用消息(Procedure Call)异步...
  • 在日常工作中,几乎不会建立文件的硬链接,知道即可 打包压缩 打包压缩 是日常工作中备份文件的一方式 在不同操作系统中,常用的打包压缩方式是不同的选项 含义 Windows 常用 rar Mac 常用 zip Linux 常用 tar.gz ...
  • java数据结构与算法之顺序表与链表深入分析

    万次阅读 多人点赞 2016-11-05 16:24:30
    开篇直接奔主题,无论是顺序表还是链表,它们都是线性表的一,用比较官方的话来讲,线性表是其组成元素间具有线性关系的一线性结构,而我们恰好可以采用顺序存储和链式存储结构来表示线性表。接下来将从以下几点...
  • 数据的四存储结构

    千次阅读 2021-07-28 08:35:42
    数据的四基本存储结构是:1、顺序存储顺序存储方式就是在一块连续的存储区域一个接着一个的存放数据。顺序存储方式把逻辑上相邻的节点存储在物理位置相邻的存储单元里,节点间的逻辑关系由存储单元的邻接关系来...
  • 前言: 1. 环境变量是操作系统环境设置的变量,适用于整个系统的用户进程;...4. 但是在使用之前,必须用export命令导出。 一、环境变量文件介绍  Linux中环境变量包括系统级和用户级,系统级的环境变量是每
  • 常用的几java集合类总结

    万次阅读 多人点赞 2018-08-09 18:13:16
    Java集合框架主要包括两类型的容器,一是集合(Collection),另一是图(Map)。Collection接口又有3种子类型,List、Set和Queue,再下面是一些抽象类,最后是具体实现类,常用的有ArrayList、LinkedList、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 429,270
精华内容 171,708
热门标签
关键字:

常用的说明顺序4种