线程数

Android 线程池

纵饮孤独 提交于 2019-12-21 05:10:07
先来看一下ThreadPoolExecutor的构造方法 //五个参数的构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) //六个参数的构造函数-1 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) //六个参数的构造函数-2 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) //七个参数的构造函数 public ThreadPoolExecutor(int corePoolSize, int

java线程池

安稳与你 提交于 2019-12-21 03:51:08
corePoolSize :线程池的核心池大小,在创建线程池之后,线程池默认没有任何线程。 当有任务过来的时候才会去创建创建线程执行任务。换个说法,线程池创建之后,线程池中的线程数为0,当任务过来就会创建一个线程去执行,直到线程数达到corePoolSize 之后,就会被到达的任务放在队列中。(注意是到达的任务)。换句更精炼的话:corePoolSize 表示允许线程池中允许同时运行的最大线程数。 如果执行了线程池的prestartAllCoreThreads()方法,线程池会提前创建并启动所有核心线程。 maximumPoolSize :线程池允许的最大线程数,他表示最大能创建多少个线程。maximumPoolSize肯定是大于等于corePoolSize。 keepAliveTime :表示线程没有任务时最多保持多久然后停止。默认情况下,只有线程池中线程数大于corePoolSize 时,keepAliveTime 才会起作用。换句话说,当线程池中的线程数大于corePoolSize,并且一个线程空闲时间达到了keepAliveTime,那么就是shutdown。 Unit:keepAliveTime 的单位。 workQueue :一个阻塞队列,用来存储等待执行的任务,当线程池中的线程数超过它的corePoolSize的时候,线程会进入阻塞队列进行阻塞等待

Java多线程18:线程池

假装没事ソ 提交于 2019-12-21 03:50:48
使用线程池与不使用线程池的差别 先来看一下使用线程池与不使用线程池的差别,第一段代码是使用线程池的: public static void main(String[] args) { long startTime = System.currentTimeMillis(); final List<Integer> l = new LinkedList<Integer>(); ThreadPoolExecutor tp = new ThreadPoolExecutor(100, 100, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(20000)); final Random random = new Random(); for (int i = 0; i < 20000; i++) { tp.execute(new Runnable() { public void run() { l.add(random.nextInt()); } }); } tp.shutdown(); try { tp.awaitTermination(1, TimeUnit.DAYS); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println

创建线程池需要注意的事情

十年热恋 提交于 2019-12-21 02:32:48
1 介绍 阿里的java代码规范有一条是强制建议开发者不要使用Executors创建线程池。 而是建议我们使用原生的ThreadPoolExecutor进行创建,既然这么建议了,自然是有它建议的道理,下面我们就来简单的分析一下为什么不推荐我们使用Executors进行创建。 2 分析 作为一个java开发,线程池是我们工作当中,必会去使用的一个工具,关于线程池的好处,自然是不用多说,反正就是好处很多。 既然是阿里推荐我们使用 ThreadPoolExecutor(这个类也就是线程池的核心类) 进行创建线程池,那我们就先看一下这个类的核心方法: ThreadPoolExecutor 类所提供的几个开放的公共方法就是上图的1,2,3 部分,关于第二部分的方法,主要就是对于已经创建的线程池对象进行功能增强,比如设置核心线程是否可以超时和终止的策略,关于第三部分的公共方法就是获取对应线程池的一些基础参数 我们重点看一下1部分中的方法,我们会发现,1部分都是关于 ThreadPoolExecutor 的构造函数,只是对应的参数个数不同而已,我们重点看一下构造函数中参数最多的那个 其实其他的构造函数只是针对没有的参数进行默认初始化,最终都是会调到这个最长的构造函数进行线程池的创建。 corePoolSize :表示线程池中常驻的核心线程数,等于0表示任务执行完毕之后

Java线程池面试

纵饮孤独 提交于 2019-12-19 04:06:23
New Thread的弊端 每次new Thread会新建对象,性能差 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或OOM 缺少更多功能,如更多执行、定期执行、线程中断 线程池优点 重用存在的线程,减少对象创建、消亡的开销 可有效控制最大并发线程数,提高系统资源利用率,同时可以避免过多资源竞争,避免阻塞 提供定时执行、定期执行、单线程、并发数控制等功能 ThreadPoolExcutor的参数 ThreadPoolExcutor: 线程池,可以通过调用 Executors 以下静态工厂方法来创建线程池并返回一个 ExecutorService 对象。 corePoolSize: 核心线程数量 maximumPoolSize: 允许创建的最大线程数 workQueue: 阻塞队列,存储等待执行的任务(重要) keepAliveTime: 线程没有任务执行时最多保持多久时间终止 unit: keepAliveTime的时间单位(DAYS HOURS MINUTES MILLISECONDS MICROSECONDS NANOSECONDS) threadFactory: 线程工厂,用来创建线程 rejectHandler: 当拒绝处理任务时的策略 ThreadPoolExcutor的重要方法 execute() 向线程池提交一个任务

Java并发系列[10]----ThreadPoolExecutor源码分析

冷暖自知 提交于 2019-12-19 01:16:27
在日常的开发调试中,我们经常会直接new一个Thread对象来执行某个任务。这种方式在任务数较少的情况下比较简单实用,但是在并发量较大的场景中却有着致命的缺陷。例如在访问量巨大的网站中,如果每个请求都开启一个线程来处理的话,即使是再强大的服务器也支撑不住。一台电脑的CPU资源是有限的,在CPU较为空闲的情况下,新增线程可以提高CPU的利用率,达到提升性能的效果。但是在CPU满载运行的情况下,再继续增加线程不仅不能提升性能,反而因为线程的竞争加大而导致性能下降,甚至导致服务器宕机。因此,在这种情况下我们可以利用线程池来使线程数保持在合理的范围内,使得CPU资源被充分的利用,且避免因过载而导致宕机的危险。在Executors中为我们提供了多种静态工厂方法来创建各种特性的线程池,其中大多数是返回ThreadPoolExecutor对象。因此本篇我们从ThreadPoolExecutor类着手,深入探究线程池的实现机制。 1. 线程池状态和线程数的表示 1 //高3位表示线程池状态, 后29位表示线程个数 2 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); 3 private static final int COUNT_BITS = Integer.SIZE - 3; 4 private

LINUX最大线程数及最大进程数

*爱你&永不变心* 提交于 2019-12-18 20:34:54
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 查看最大线程数: cat /proc/sys/kernel/threads-max ulimit User limits - limit the use of system-wide resources. Syntax ulimit [-acdfHlmnpsStuv] [limit] Options -S Change and report the soft limit associated with a resource. -H Change and report the hard limit associated with a resource. -a All current limits are reported. -c The maximum size of core files created. -d The maximum size of a process's data segment. -f The maximum size of files created by the shell(default option) -l The maximum size that may be locked into memory. -m The maximum resident set size. -n

ceph集群配置注意事项

坚强是说给别人听的谎言 提交于 2019-12-17 11:08:57
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> ceph部署环境: 硬件环境。4台4U的服务器,服务器配置信息如下: 1)CPU是Intel Xeon E5-2650(32核心); 2)内存大小是128GB; 3)服务器内共有35块HDD,其中一块HDD用于安装操作系统,另外34块HDD用于ceph存储; 4)网络采用public/cluster类型的网络; 软件环境。 1)操作系统:4台服务器都采用ubuntu-14.04.1; 2)ceph软件版本:Firefly最新版(0.80.11); 出现的问题: 当启动集群时,ceph集群中出现大量的非active+clean的PGs并且osdmap也不稳定,osd的状态在up和doan之间来回的切换。这样导致ceph集群迟迟不能处于可用状态。 问题原因: 由于在一个host上启动的osd数量太多了(34个OSDs),导致在ceph集群启动时以及ceph集群在recovery和rebalance时,由于产生大量的线程,该线程数量已经远远超越了linux内核默认配置的系统最大线程数。 解决方案: linux内核默认的最大线程数是32768,可以通过命令#sysctl kernel.pid_max来查看。该最大线程数是针对桌面系统的,而对于服务器以及集群的系统来说,这个值是不够的。因此最好将该值设置成最大值,即:

线程基本知识

我只是一个虾纸丫 提交于 2019-12-15 21:24:24
线程的状态以及状态之间的切换 线程从创建到死亡有七个状态,分别是初始状态,准备运行,运行状态,阻塞状态,睡眠状态(超时等待状态),等待状态,死亡状态,关系如图所示: 线程的创建 实现线程的几种方式: 继承Thread类 实现Runnable接口 匿名内部类的方式 带返回值的线程 定时器 线程池实现 Lambda表达式实现 继承Thread // 无名 public class Demo01 extends Thread { @Override public void run() { System.out.println(getName() + "执行了。。。"); } public static void main(String[] args) { Demo01 d1 = new Demo01(); Demo01 d2 = new Demo01(); d1.start(); d2.start(); } } // 有名 public class Demo01 extends Thread { @Override public void run() { System.out.println(getName() + "执行了。。。"); } public Demo01(String name) { super(name); } public static void main(String

制造一个轮子线程池

倖福魔咒の 提交于 2019-12-15 03:40:30
很早之前就看过线程池源码(知道大概的运行原理),但是只是知道怎么用,并没有深究。这次为了帮助自己深入理解线程池,决定手动写一个极简(陋)的线程池,顺便记录思考和造轮过程。 虽然不太可能和jdk自带的那么完美,但是该有的功能还是要有: 新建线程池,有核心线程数和最大线程数,线程存活时间,队列 在线程池加入线程,当前线程数不超过核心线程数就新建线程,超过核心放队列,队列满了再新建线程,达到最大线程 全部线程运行完成后会保留核心线程数,支持线程存活时间 立即关闭线程池 优雅的关闭线程池 1.新建一个轮子线程池类,就一个构造函数,把需要的参数都传进来 2.用ThreadPoolExecutor的时候,新建了线程池就会往里面提交线程了,我们写的也一样,而且往线程池里面加线程的时候就会判断:当前运行线程数是否大于核心线程数,是否大于最大线程数等,这里需要一个当前运行线程数的变量。 所以这里增加一个成员变量activeCount,初始值为0,运行一个线程就加1,线程运行结束就减1,这里面减的时候是在不同线程里面,所以为了线程安全用AtomicInteger类型 /** 当前活动线程数 */ private AtomicInteger activeCount = new AtomicInteger(0); 提交线程的方法,看过ThreadPoolExecutor源码的应该知道