首页 文章 精选 留言 我的

精选列表

搜索[知识管理],共10000篇文章
优秀的个人博客,低调大师

学习Java基础知识,打通面试关~十三锁机制

静态创建线程池 我们平常使用的大部分还是依靠java中自带的静态工厂产生的线程池。先了解下自带的线程池。 newFixedThreadPool(int numThreads) 该线程池会在初始化的指定线程数量。具有以下的特点1.在任何时刻都是最多有numThreads的线程数量活动。如果超过限制会在LinkedBlockingQueue中等待。 2.当达到核心线程数的时候,线程数不在继续增加。3.有工作线程退出,新的工作线程被创建来达到设置的线程数。 Executors.newFixedThreadPool(1); //源码实现 public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); } newCachedThreadPool 该线程池是一个可以用来缓存的线程池。1.尝试缓存使用过的线程。2.没有缓存的线程池时,就会使用工厂方法创建线程池,最大的容量理论上是Integer.MAX_VALUE。这个跟服务器的配置有关。所以如果过来大量的线程任务,那么该线程池会在瞬间创建多个线程来执行工作。3.时间上多余的线程超过60秒会被终止移除缓存中。4.内部使用的SynchronousQueue实现的队列,该队列在实现的时候没有容量。适合来做交换的工作。 Executors.newCachedThreadPool(); //源码实现 public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } newSingleThreadExecutor 该线程池是用来设置单个的线程池,使用的队列是无界队列。因为提交的任务只要一个是能活动的,剩下的是放到无界队列中。队列是先进先出的。那么执行顺序是有序的。 Executors.newSingleThreadExecutor(); //源码 public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); } newWorkStealingPool 工作线程,该线程是在jdk1.8以后新增加的.使用的是ForkJoinPool创建线程池。该任务执行没有顺序。需要考虑到硬件的cpu核心数。 Executors.newWorkStealingPool(); public static ExecutorService newWorkStealingPool() { return new ForkJoinPool (Runtime.getRuntime().availableProcessors(), //默认使用的是硬件的cpu数目 ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true); } Executors.newWorkStealingPool(10); public static ExecutorService newWorkStealingPool(int parallelism) { return new ForkJoinPool (parallelism, // 使用的是自定义的核心数 ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true); } newSingleThreadScheduledExecutor()与newScheduledThreadPool(int poolSize) 周期性的调度执行任务的线程池。 单个执行。 Executors.newSingleThreadScheduledExecutor(); public static ScheduledExecutorService newSingleThreadScheduledExecutor() { return new DelegatedScheduledExecutorService (new ScheduledThreadPoolExecutor(1)); } //核心周期执行的线程数 Executors.newScheduledThreadPool(10); public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize); } 了解其java内部的静态线程池,并且在程序中使用其策略。当然在这种我们没有看到的是线程池的拒绝策略。无界队列和有界队列,核心数的与最大的核心数的设置,这些不同。那么我们的执行拒绝策略也是不同的。在接下里的文章我们会具体了解拒绝策略。 原文发布时间为:2018-07-09本文作者:mengrui本文来自云栖社区合作伙伴“LuckQI”,了解相关信息可以关注“LuckQI”。

优秀的个人博客,低调大师

marathon小知识点分享之如何远程调试marathon

目的,在centos服务器上启动marathon服务后,可以在window上使用intellij idea进行远程调试; 主要环境: 1、本人是参考https://mesosphere.github.io/marathon/docs/提供的方式,部署的marathon服务; 2、从https://github.com/mesosphere/marathon上down下的marathon源码 如果不想修改源码的话,将marathon的源码down下来后,直接导入到intellijidea里,就可以 如果想修改源码后,再进行远程调试的话,那么需要对marathon源码进行重新编译,打包成jar包后,替换服务器上的/marathon根目录/target/scala-2.11下的源码包;这样的话,保证本地调试的源码与服务器上运行的源码是一致。 marathon的远程调试与spark的远程调试有什么区别? 个人感觉,主要一方面的区别: 在去年年底研究过spark的远程调试,需要在spark-class脚本里添加jvm参数,如: 声明JAVA_OPTS 而Marathon这一点做的比较好,不需要添加, 无论你是从git上直接down的源码,还是通过https://mesosphere.github.io/marathon/下载部署包 在启动脚本bin/start里都提供了调试参数,如下图所示: 不过,如果要实现远程调试的话,需要将上面参数suspend=n的值,由n改成y,不然的话,远程调试不起作用。 具体步骤: 1、修改启动脚本start 2、更新启动marathon服务的命令,改成调试模式 启动脚本start里 因此,将marathon的启动服务的命令,改成下面的形式 /usr/local/marathon/bin/start--jvm-debug 9999--master zk://master001:2181,master002:2181,master003:2181/mesos--zk zk://master001:2181,master002:2181,master003:2181/marathon--framework_name marathon --mesos_user root --mesos_role marathon_role--mesos_authentication_principal marathon_user 3、在intellij idea中,将启动marathon的方式,改成远程调试模式 4、在服务器上,启动marathon服务, 5、window上,打断点,并启动debug 6、开始debug远程调试 查看服务器上,是否打印出了日志 OK! 本文转自故新51CTO博客,原文链接:http://blog.51cto.com/xingej/1957313,如需转载请自行联系原作者

优秀的个人博客,低调大师

Linux 小知识翻译 - 「Linux和CPU的兼容性」

Linux刚开始是作为可运行在 Intel 的 「i386」CPU上,与POSIX兼容的内核来开发的。 而现在主流的Linux是指能在所谓「PC」上运行的内核。「PC」是指采用「IA(intel架构)」的机器。 IA(Intel Architecture)虽然「I」是指Intel,但Linux并不是只能运行在Intel生产的CPU上。比如另一个非常大CPU生产商AMD所生产的兼容IA的CPU, 还有其他很多以省电为目的的兼容IA的CPU,这些CPU都可以被称作「IA」。 因此,Linux也就有可能在这些CPU的机器正常运行。 但是,有一点需要注意的是,这个CPU是什么种类的,以及在这个CPU上运行的软件是和哪个CPU相对应的。 总而言之,所谓的IA,不仅指和最初的「i386」兼容的各种CPU,也包括之后的进化版本「i586」和「i686」架构的CPU。 其实问题主要在「i386」CPU上,因为最近的Linux发行版的内核都是基于「i586」及以上架构的CPU的,在「i386」上无法工作。 比如有这样的情况,Linux内核的安装程序是基于「i386」的,但是实际安装的Linux内核却必须要在「i586」及以上架构的CPU上才能运行。 还有,采用省电CPU的小型PC很流行,在这些机器上运行linux内核时,要注意CPU的兼容性。 本文转自wang_yb博客园博客,原文链接:http://www.cnblogs.com/wang_yb/p/3755459.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册