精华内容
下载资源
问答
  • ============如何定制自己的线程池===== 核心线程数 第一个需要设置的参数往往是 corePoolSize 核心线程数,在上一课时我们讲过,合理的线程数量和任务类型,以及 CPU 核心数都有关系,基本结论是线程的平均工作...

    调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能。在实际工作中,我们需要根据任务类型的不同选择对应的策略。
    CPU 密集型任务
    首先,我们来看 CPU 密集型任务,比如加密、解密、压缩、计算等一系列需要大量耗费 CPU 资源的任务。对于这样的任务最佳的线程数为 CPU 核心数的 1~2 倍,如果设置过多的线程数,实际上并不会起到很好的效果。此时假设我们设置的线程数量是 CPU 核心数的 2 倍以上,因为计算任务非常重,会占用大量的 CPU 资源,所以这时 CPU 的每个核心工作基本都是满负荷的,而我们又设置了过多的线程,每个线程都想去利用 CPU 资源来执行自己的任务,这就会造成不必要的上下文切换,此时线程数的增多并没有让性能提升,反而由于线程数量过多会导致性能下降。

     

    针对这种情况,我们最好还要同时考虑在同一台机器上还有哪些其他会占用过多 CPU 资源的程序在运行,然后对资源使用做整体的平衡。

    耗时 IO 型任务    
    第二种任务是耗时 IO 型,比如数据库、文件的读写,网络通信等任务,这种任务的特点是并不会特别消耗 CPU 资源,但是 IO 操作很耗时,总体会占用比较多的时间。对于这种任务最大线程数一般会大于 CPU 核心数很多倍,因为 IO 读写速度相比于 CPU 的速度而言是比较慢的,如果我们设置过少的线程数,就可能导致 CPU 资源的浪费。而如果我们设置更多的线程数,那么当一部分线程正在等待 IO 的时候,它们此时并不需要 CPU 来计算,那么另外的线程便可以利用 CPU 去执行其他的任务,互不影响,这样的话在任务队列中等待的任务就会减少,可以更好地利用资源。

     

    《Java并发编程实战》的作者 Brain Goetz 推荐的计算方法:

    线程数 = CPU 核心数 *(1+平均等待时间/平均工作时间)

    通过这个公式,我们可以计算出一个合理的线程数量,如果任务的平均等待时间长,线程数就随之增加,而如果平均工作时间长,也就是对于我们上面的 CPU 密集型任务,线程数就随之减少。

     

    太少的线程数会使得程序整体性能降低,而过多的线程也会消耗内存等其他资源,所以如果想要更准确的话,可以进行压测,监控 JVM 的线程情况以及 CPU 的负载情况,根据实际情况衡量应该创建的线程数,合理并充分利用资源。

    结论     
    综上所述我们就可以得出一个结论:

    线程的平均工作时间所占比例越高,就需要越少的线程;

    线程的平均等待时间所占比例越高,就需要越多的线程;

    针对不同的程序,进行对应的实际测试就可以得到最合适的选择。

     

    ============如何定制自己的线程池=====

    核心线程数


    第一个需要设置的参数往往是 corePoolSize 核心线程数,在上一课时我们讲过,合理的线程数量和任务类型,以及 CPU 核心数都有关系,基本结论是线程的平均工作时间所占比例越高,就需要越少的线程;线程的平均等待时间所占比例越高,就需要越多的线程。而对于最大线程数而言,如果我们执行的任务类型不是固定的,比如可能一段时间是 CPU 密集型,另一段时间是 IO 密集型,或是同时有两种任务相互混搭。那么在这种情况下,我们可以把最大线程数设置成核心线程数的几倍,以便应对任务突发情况。当然更好的办法是用不同的线程池执行不同类型的任务,让任务按照类型区分开,而不是混杂在一起,这样就可以按照上一课时估算的线程数或经过压测得到的结果来设置合理的线程数了,达到更好的性能。

    阻塞队列


    对于阻塞队列这个参数而言,我们可以选择之前介绍过的 LinkedBlockingQueue 或者 SynchronousQueue 或者 DelayedWorkQueue,不过还有一种常用的阻塞队列叫 ArrayBlockingQueue,它也经常被用于线程池中,这种阻塞队列内部是用数组实现的,在新建对象的时候要求传入容量值,且后期不能扩容,所以 ArrayBlockingQueue 的最大的特点就是容量是有限的。这样一来,如果任务队列放满了任务,而且线程数也已经达到了最大值,线程池根据规则就会拒绝新提交的任务,这样一来就可能会产生一定的数据丢失。

    但相比于无限增加任务或者线程数导致内存不足,进而导致程序崩溃,数据丢失还是要更好一些的,如果我们使用了 ArrayBlockingQueue 这种阻塞队列,再加上我们限制了最大线程数量,就可以非常有效地防止资源耗尽的情况发生。此时的队列容量大小和 maxPoolSize 是一个 trade-off,如果我们使用容量更大的队列和更小的最大线程数,就可以减少上下文切换带来的开销,但也可能因此降低整体的吞吐量;如果我们的任务是 IO 密集型,则可以选择稍小容量的队列和更大的最大线程数,这样整体的效率就会更高,不过也会带来更多的上下文切换。

    线程工厂
    对于线程工厂 threadFactory 这个参数,我们可以使用默认的 defaultThreadFactory,也可以传入自定义的有额外能力的线程工厂,因为我们可能有多个线程池,而不同的线程池之间有必要通过不同的名字来进行区分,所以可以传入能根据业务信息进行命名的线程工厂,以便后续可以根据线程名区分不同的业务进而快速定位问题代码。比如可以通过com.google.common.util.concurrent.ThreadFactory

    Builder 来实现,如代码所示。

    复制代码
    ThreadFactoryBuilder builder = new ThreadFactoryBuilder();
    ThreadFactory rpcFactory = builder.setNameFormat("rpc-pool-%d").build();
    我们生成了名字为 rpcFactory 的 ThreadFactory,它的 nameFormat 为 "rpc-pool-%d" ,那么它生成的线程的名字是有固定格式的,它生成的线程的名字分别为"rpc-pool-1","rpc-pool-2" ,以此类推。

    拒绝策略
    最后一个参数是拒绝策略,我们可以根据业务需要,选择第 11 讲里的四种拒绝策略之一来使用:AbortPolicy,DiscardPolicy,DiscardOldestPolicy 或者 CallerRunsPolicy。除此之外,我们还可以通过实现 RejectedExecutionHandler 接口来实现自己的拒绝策略,在接口中我们需要实现 rejectedExecution 方法,在 rejectedExecution 方法中,执行例如打印日志、暂存任务、重新执行等自定义的拒绝策略,以便满足业务需求。如代码所示。

    复制代码
    private static class CustomRejectionHandler implements RejectedExecutionHandler { 
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { 
            //打印日志、暂存任务、重新执行等拒绝策略
        } 
    }
    总结
    所以定制自己的线程池和我们的业务是强相关的,首先我们需要掌握每个参数的含义,以及常见的选项,然后根据实际需要,比如说并发量、内存大小、是否接受任务被拒绝等一系列因素去定制一个非常适合自己业务的线程池,这样既不会导致内存不足,同时又可以用合适数量的线程来保障任务执行的效率,并在拒绝任务时有所记录方便日后进行追溯。

     

    引用:https://kaiwu.lagou.com/course/courseInfo.htm?courseId=16#/videoDetail?lessonId=254


     

     

    展开全文
  • 第一步:通过openstack user list命令查看所有...第三步:通过openstack role assignment list查看用户、角色和项目三者之间对应关系,从而确定用户的角色。(注:这三个命令都必须进入用户进行查询,否则无法使用)...

    第一步:通过openstack user list命令查看所有用户的id信息;

    第二步:通过openstack project list命令查看所有项目的id信息;

    第三步:通过openstack role assignment list查看用户、角色和项目三者之间对应关系,从而确定用户的角色。

    注:这三个命令都必须进入用户进行查询,否则无法使用

    展开全文
  • 一般系统的服务划分有以下两种维度: 按模块划分 ...这个比较适用于基础服务类的场景:一个大系统,每个服务看起来关联都很紧密,存在相互的调用关系。这时候可以考虑它们各自承担的角色和使命。 ...

    一般系统的服务划分有以下两种维度:

    按模块划分

    这个比较适用于偏业务的场景:复杂的系统,最好先按业务领域横向拆分成可独立部署的子系统,每个子系统内部再按技术纵向拆分成不同的子模块。

    按角色划分

    这个比较适用于基础服务类的场景:一个大系统,每个服务看起来关联都很紧密,存在相互的调用关系。这时候可以考虑它们各自承担的角色和使命。

     

    核心原则

    单一职责:能不能用一句话说清楚这个服务的职责?非要分成两句话,那就分成两个服务。

    在核心原则的基础上,符合下面的原则是一个比较好的实践:

    松散耦合原则

    可复用性原则

    服务自治原则

    可发现性原则

    可组合性原则

        服务自治、可发现性相对难理解一些,展开一下。

    服务自治

    当一个服务的逻辑单元由自身的领域边界内所控制,不受其他外界条件的影响(外界条件带有不可预测性),且运行环境是自身可控,完全自给自足,我们认为这个服务是自治的。

    自治的服务自身可以很好的对稳定性做把控。

    可发现性

    因为服务是被用来复用的,如果在服务设计过程中,并不能发现一个已经存在的服务,而需要重新建立多个同样逻辑元旦的服务,会极大增加管理和维护成本。

    服务发现主要有两种:

    1.设计时发现(人)

    服务设计人员和研发人员在研发一个新的服务时,可以通过搜索服务仓库的元数据信息,查看服务仓库是否已存在此服务,没有才重新开发。

    2.运行时发现(程序)

    服务的消费者可以通过服务注册中心查到特定服务的接口调用地址调用。

     

    要根据系统的规模和人员配置情况。

    比如如果系统一个系统的日活跃用户在万级和千万级,粒度肯定是不一样的。同样,基于系统规模带来的产出,那么开发人员数量也会相应不同。比较好的一个实践是一个人独立负责一个到两个服务。多人维护一个服务,交互成本非常高。

     

    关注静儿公众号,不定期漫画技术推送~

     

    转载于:https://www.cnblogs.com/xiexj/p/9252372.html

    展开全文
  • 编译期确定类型关系

    2013-11-06 23:18:00
    假设两个类型T和U,怎样能够在编译器知道他们是否能够转换?这样可以避免使用dynamic_cast之类的运行期函数,提高运行效率。 sizeof是解决问题的关键,不管表达式有多复杂,sizeof会直接传回大小,不需托到执行期才...

    假设两个类型T和U,怎样能够在编译器知道他们是否能够转换?这样可以避免使用dynamic_cast之类的运行期函数,提高运行效率。

    sizeof是解决问题的关键,不管表达式有多复杂,sizeof会直接传回大小,不需托到执行期才评估。

    通过定义两个重载函数,参数分别是U类型和任意类型,用T对象来调用这个函数,如果调用的是U类型参数的版本,则说明T类型可以自动转换成U类型。

    为了在编译期就能发现这个关系,给这两个重载的函数定义返回两个大小不同的类型,一个为small,一个为big(假定sizeof(big)!=sizeof(small)),如下所示

    templage<class T,clas U>
    small test(U);
    templage<class T,clas U>
    big test(...);


    如果sizeof(test<T,U>( T()) )==sizeof(small) 为true,则说明调用的第一个返回small版本的test函数,说明T类型的对象可以自动转换成U类型。

    通过上面的分析,即可在编译期得到两个类型的转换关系,通过进一步改变也可以得到两个类型是否可以互相转换,还可以通过模板的偏特化来判断两个类型是否一样,详细的设计可以参考《c++设计新思维》一书。

     

    展开全文
  • 几何要素定义之间的相互关系,如图9所示。 要素可分为组成要素(表面轮廓、轮廓线)和导出要素(中心点、轴线、中心面)导出要素是由一个或几个组成要素所确定的。 在图样上给出的是理论正确的公称要素,包括公称...
  • nginx 中location和root,你确定真的明白他们关系

    万次阅读 多人点赞 2016-01-17 14:48:34
    当时卡在location和root中,但是网上却比较少聊这方面的关系,一般都是聊location匹配命令(这里可以看看http://www.nginx.cn/115.html),花了一下午,彻底搞清楚了location和root到底怎样找到文件的。
  • 根据使用的软件包,依赖关系可以通过将任务及其后续任务的标识符进行关联来表示。依赖关系说明了任务之间关联/并列的要求。...项目计划加入依赖关系,就能找出项目的关键路径并且能够确定它对项目工期的影响。 ...
  • 怎样追女生才能把喜欢的女生能追到手?不是你为她做了多少事情,而是你用的方法对不对。我们忙前忙后的为女生做了很多的事情,结果换来的却是妹子冷眼相对。会追女生的男生往往不回去这么做,他会在恰当的时机做一些...
  • 怎样解决问题

    2017-12-22 16:19:44
    怎样解决问题 1.理解问题,你必须理解要解决的问题 问题是什么?条件是什么?数据是什么?有可能满足条件吗?已知条件足以确定未知吗 ?已知条件是否不够充分?是够矛盾?是否冗余? 2.设计一个方案 找到...
  • 我认为,要想维持一个良好的游戏秩序,首先要确定: 游戏本身提供给玩家的(或者说游戏所鼓励的)是怎样一些社会关系? 玩家与玩家之间可能表现的和正在表现的是一些怎样的社会关系? 证明过程就省了(其实是偶不会...
  • 作为从事此项工作的同志,首先要有过硬的基本功,要能对有技术参数的电路原理图进行总体了解,能进行划分功能模块,找出信号流向,确定元件作用。若不知电路的作用,可先分析电路的输入和输出信号之间的关系。如信号...
  • 浏览器是怎样渲染网页的 本文主要简单的介绍一下浏览器是如何渲染网页的。 1. 构建DOM Tree 浏览器首先将收到的HTML代码,通过HTML解析器解析构建为一颗DOM树。而DOM树就像是一颗倒长的大树,这样的对象模型决定了...
  • 怎样做网站规划

    2005-02-22 16:18:00
    一个网站的成功与否与建站前的网站规划有着极为重要的关系。在建立网站前应明确建设网站的目的,确定网站的功能,确定网站规模、投入费用,进行必要的市场分析等。只有详细的规划,才能避免在网站建设中出现的很多...
  • 3.3 类之间的关系 UML, 类图

    千次阅读 2012-05-10 17:57:17
    3.3 类之间的关系 ...A、B两个类,它们之间有关系,但又不能确定怎样关系,我们可以这样画: 下载 (3.61 KB) 2011-8-3 14:19 图 3.4 “直线”关系 这个“直线”关系其实就是关联(Associ
  • 作为从事此项工作的同志,首先要有过硬的基本功,要能对有技术参数的电路原理图进行总体了解,能进行划分功能模块,找出信号流向,确定元件作用。若不知电路的作用,可先分析电路的输入和输出信号之间的关系。如信号...
  • 怎样从数组中删除某个值?

    千次阅读 2014-04-21 21:02:13
    我不确定undef是否和从数组中消除值有确切的关系,猜测一下,如果我们将undef视为"空",那么会有一些联系。但通常来说,将某些东西赋值为undef和删除某些东西是不一样的。 首先来看怎样把数组的元素赋值为undef,...
  • 导入step零件模型文件,然后利用pythonocc将其组装,确定零件与零件之间的约束关系
  • 一:关系型数据库的设计阶段 1:规划阶段:确定是否需要使用数据库,使用哪种类型的数据库,使用哪个数据库产品。 2:概念阶段:概念阶段的主要工作是收集并分析需求。 识别需求,主要是识别数据实体和业务规则。...
  • 怎样做好网站规划?

    2008-12-23 13:16:00
    一个网站的成功与否与建站前的网站规划有着极为重要的关系。 /p> 在建立网站前应明确建设网站的目的,确定网站的功能,确定网站规模、投入费用,进行必要的市场分析等。只有详细的规划,才能避免在网站建设中出现的...
  • 怎样才能做好软件技术经理?  一、 工作上。 目标管理和计划管理结合 目标管理是以目标为导向,以人为中心,以成果为标准,而使组织和个人取得最佳业绩的现代管理方法。 目标管理亦称“成果管理”。是指...
  • 怎样提升代码质量 尽管写了多年的代码,但是始终有一件事不敢确定,就是自己的代码究竟写得好不好?这个问题很难有确切的答案,因为这个跟风格、规范有很大关系,而风格、规范很难说好还是不好。 但我觉得好的代码,...
  • 用户在查询部分输入查询条件后,单击【导入Excul】按钮,用户所添加的查询条件将被提交给数据处理页,处理页用select case判断隐藏域的值,进而确定怎样处理,传值的程序代码如下: sql="dbo.tb_Linkman.id is ...
  • 应用层与运输层的关系

    千次阅读 2018-09-22 10:41:09
     http与tcp的关系怎样描述呢?  所谓协议,就是一系列动作的有限集合,协议的FSM(状态机)必须是有限的。应用层的某个进程(进程就是某个二进制文件加载到cpu中)采用某个协议,运输层采用一系列动作进行运输应用...
  • 怎样看电路原理图

    千次阅读 2009-08-05 10:41:00
    作为从事此项工作的同仁,首先要有过硬的基本功,要能对有技术参数的电路原理图进行总体了解,能进行划分功能模块,找出信号流向,确定元件作用。若不知电路的作用,可先分析电路的输入和输出信号之间的关系。如信号...
  • 目前,越来越多的企业选择建设网站,但也有一些中小企业新手苦恼,因为对网站建设过程的各个方面还不是很了解,没关系,今天准度科技就和新手小白们分享一下网站建设的基本流程,希望对大家有所帮助。 1、规划内容 ...
  • 前言序锦: 今天复习数据库原理的过程中,复习到数据库原理...转换后的关系类型又是怎样的呢?)老师上课也基本都是提了一下,然后就带过了,一时间很苦恼,不知如何是好,这才有网上大淘沙地搜索学习了一番,这...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 409
精华内容 163
关键字:

怎样确定关系