线程数

深入浅出Java(Android )线程池ThreadPoolExecutor

血红的双手。 提交于 2020-03-30 15:26:01
前言 关于线程池 在Java/Android开发中,设计到并发的请求,那基本上是离不开线程池了。用线程池的好处: 1、减少线程频繁创建、销毁的开销; 2、好控制并发量,降低OOM的可能,至于原因文中会说; 3、提高程序的响应速度,因为可以省去部分创建的过程; 要不要深度学习线程池 对于服务端的同学来说应该会比较重视这一块,因为需要做高并发;而移动端的同学可能比较容易忽略这一块。有些人觉得平时也用不到,移动端没有那么大并发量,或者说第三方框架中已经完成了,比如 OkHtttp ; 其实只能说有这种想法的同学还没有遇到大一点的项目或者说没有太多多线程优化的经验。 如果你真的遇到了这种项目瓶颈,你连线程池的运行原理都不知道,那又如何解决项目问题呢? 如果你要寻求一份中高级开发工程师的工作,那线程池是基本是必问题目之一,而且还要有一定深度。 如何深度学习线程池 这也是我们今天的重点,本文将从下面几点带大家快速掌握线程池的要点: 1、从API使用到原码解析,基于JDK1.8版本; 2、从源码阅读(深入)中总结出(浅出)线程池工作原理; 3、对应用场景的分析以及异常处理 预览 线程池类图.png 先对线程池的部分核心类/接口做个简介,大家有个印象就好。 Executor接口 public interface Executor { /** * 就一个方法,用来执行线程任务的

自已写的线程池

老子叫甜甜 提交于 2020-03-29 00:49:47
C#有ThreadPool和Task,为什么还要自己写线程池?我以前也没想过自己写线程池,都是用ThreadPool或Task,前段时间写爬虫,我想控制10个线程爬网页、10个线程下载网页上的图片,不然的话因为网页很多,图片相对较少,可能大部分线程都在爬网页,少量线程在下载图片,这样下载图片的速度慢了,所以我想到了自己写线程池MyThreadPool,再配合ThreadPool使用,精确控制爬网页和下载图片的线程数。不过这个线程池写的比较简单,缺点是线程池会瞬间创建最大数量的工作线程。 线程池类代码: using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace Utils { /// <summary> /// 线程池 /// </summary> public static class MyThreadPool { /// <summary> /// 最大工作线程数 /// </summary> private static int m_WorkerThreads = 5; /// <summary> /// 线程队列 /// <

数据库连接池到底应该设多大?

↘锁芯ラ 提交于 2020-03-26 18:51:40
本文内容95%译自这篇文章: https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing ) 我在研究HikariCP(一个数据库连接池)时无意间在HikariCP的Github wiki上看到了一篇文章(即前面给出的链接),这篇文章有力地消除了我一直以来的疑虑,看完之后感觉神清气爽。故在此做译文分享。 接下来是正文 数据库连接池的配置是开发者们常常搞出坑的地方,在配置数据库连接池时,有几个可以说是和直觉背道而驰的原则需要明确。 1万并发用户访问 想象你有一个网站,压力虽然还没到Facebook那个级别,但也有个1万上下的并发访问——也就是说差不多2万左右的TPS。那么这个网站的数据库连接池应该设置成多大呢?结果可能会让你惊讶,因为这个问题的正确问法是: “这个网站的数据库连接池应该设置成多 小 呢?” 下面这个视频是Oracle Real World Performance Group发布的,请先看完: http://www.dailymotion.com/video/x2s8uec (因为这视频是英文解说且没有字幕,我替大家做一下简单的概括:) 视频中对Oracle数据库进行压力测试,9600并发线程进行数据库操作,每两次访问数据库的操作之间sleep 550ms,一开始设置的中间件线程池大小为2048:

Tomcat线程池配置

ε祈祈猫儿з 提交于 2020-03-26 16:49:51
以Tomcat8.5为例,HTTP1.1 官方文档配置地址 https://tomcat.apache.org/tomcat-8.5-doc/config/http.html <Connector port="8080" acceptCount="100" maxConnections="200" minSpareThreads="10" maxThreads="200"/> acceptCount :请求等到队列大小。当Tomcat没有空闲线程处理连接请求时,新来的链接请求将放入等待队列,默认为100。当队列超过acceptCount后新连接将被拒绝。 maxConnections :Tomcat能处理的最大并发连接数.当超过后还会接收连接并放入等待队列(acceptCount控制),连接会等待,不能被处理。BIO默认是maxThreads. 对于NIO和NIO2,默认值为10000。对于APR /native,默认值为8192。 仅对于NIO / NIO2,将该值设置为-1将禁用maxConnections功能,并且不计算连接数。 minSpareThreads :线程池最小线程数,默认为10。该配置指定线程池可以维持的空闲线程数量。(始终保持运行状态的最小线程数。 这包括活动线程和空闲线程。 如果未指定,则使用默认值10。 如果执行程序与此连接器相关联,则此属性将被忽略

线程数,射多少更舒适?

心已入冬 提交于 2020-03-25 02:49:25
3 月,跳不动了?>>> 我相信大家都用过线程池,但是线程池数量设置为多少比较合理呢? 线程数的设置的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能,因此让我们一起去探索吧! 首先要考虑到 CPU 核心数,那么在 Java 中如何获取核心线程数? 可以使用 Runtime.getRuntime().availableProcessor() 方法来获取(可能不准确,作为参考) 在确认了核心数后,再去判断是 CPU 密集型任务还是 IO 密集型任务: CPU 密集型任务:比如像加解密,压缩、计算等一系列需要大量耗费 CPU 资源的任务, 大部分场景下都是纯 CPU 计算 。 IO 密集型任务:比如像 MySQL 数据库、文件的读写、网络通信等任务,这类任务 不会特别消耗 CPU 资源,但是 IO 操作比较耗时,会占用比较多时间 。 在知道如何判断任务的类别后,让我们分两个场景进行讨论: CPU 密集型任务 对于 CPU 密集型计算,多线程本质上是提升多核 CPU 的利用率,所以对于一个 8 核的 CPU,每个核一个线程,理论上创建 8 个线程就可以了。 如果设置过多的线程数,实际上并不会起到很好的效果。此时假设我们设置的线程数量是 CPU 核心数的 2 倍,因为计算任务非常重,会占用大量的 CPU 资源,所以这时 CPU

使用线程池实现卖票

橙三吉。 提交于 2020-03-24 14:34:23
1:先写一个Runnable。 1 package ThreadPool; 2 3 /** 4 * @ProjectName: smartdata 5 * @Package: ThreadPool 6 * @ClassName: TicketRunnable 7 * @Author: heluwei 8 * @Description: 9 * @Date: 2020/3/23 18:55 10 * @Version: 1.0 11 */ 12 public class TicketRunnable implements Runnable { 13 14 // 为了保持票数的一致,票数要静态 15 static int tick = 20; 16 // 创建一个静态钥匙 17 static Object ob = "aa";//值是任意的 18 // 重写run方法,实现买票操作 19 @Override 20 public void run() { 21 while (tick > 0) { 22 synchronized (ob) {// 这个很重要,必须使用一个锁, 23 // 进去的人会把钥匙拿在手上,出来后才把钥匙拿让出来 24 if (tick > 0) { 25 System.out.println(Thread.currentThread().getName() +

线程池核心线程数和最大线程数设置依据

假如想象 提交于 2020-03-23 16:34:24
3 月,跳不动了?>>> 根据线程数设置公式 最大线程数 就是性能最高线程数 因为此时性能已经是最高,再设置比他大的线程数反而性能变低,没有意义 估算最大流量,合理设置阻塞队列长度 核心线程数也是基于性能考虑 估算平时的流量需要的线程数,设置核心线程数 来源: oschina 链接: https://my.oschina.net/u/3847203/blog/3099313

C# BeginInvoke和EndInvoke方法

蹲街弑〆低调 提交于 2020-03-23 15:47:15
转载自: BeginInvoke和EndInvoke方法 IDE:Visual Studio 2008 本系列教程主要包括如下内容: 1. BeginInvoke和EndInvoke方法 2. Thread类 3. 线程池 4. 线程同步基础 5. 死锁 6. 线程同步的7种方法 7. 如何在线程中访问GUI组件 一、线程概述 在操作系统中一个进程至少要包含一个线程,然后,在某些时候需要在同一个进程中同时执行多项任务,或是为了提供程序的性能,将要执行的任务分解成多个子任务执行。这就需要在同一个进程中开启多个线程。我们使用C#编写一个应用程序(控制台或桌面程序都可以),然后运行这个程序,并打开windows任务管理器,这时我们就会看到这个应用程序中所含有的线程数,如下图所示。 如果任务管理器没有“线程数”列,可以【查看】>【选择列】来显示“线程计数”列。从上图可以看出,几乎所有的进程都拥有两个以上的线程。从而可以看出,线程是提供应用程序性能的重要手段之一,尤其在多核CPU的机器上尤为明显。 二、用委托(Delegate) 的BeginInvoke 和EndInvoke 方法操作线程 在C#中使用线程的方法很多,使用委托的BeginInvoke和EndInvoke方法就是其中之一。BeginInvoke方法可以使用线程异步地执行委托所指向的方法

不可思议的OOM

无人久伴 提交于 2020-03-22 03:10:17
本文发现了一类OOM(OutOfMemoryError),这类OOM的特点是崩溃时java堆内存和设备物理内存都充足,下文将带你探索并解释这类OOM抛出的原因。 关键词: OutOfMemoryError, OOM,pthread_create failede, Could not allocate JNI Env 一、引子 对于每一个移动开发者,内存是都需要小心使用的资源,而线上出现的 OOM(OutOfMemoryError)都会让开发者抓狂,因为我们通常仰仗的直观的堆栈信息对于定位这种问题通常帮助不大。网上有很多资料教我们如何“紧衣缩食“的利用宝贵的堆内存(比如,使用小图片,bitmap 复用等),可是: 线上的 OOM 真的全是由于堆内存紧张导致的吗? 有没有 App 堆内存宽裕,设备物理内存也宽裕的情况下发生 OOM 的可能? 内存充裕的时候出现 OOM 崩溃? 看似不可思议,然而,最近笔者在调查一个问题的时候,通过自研的 APM 平台发现公司的一个产品的大部分 OOM 确实有这样的特征,即: OOM 崩溃时,java 堆内存远远低于 Android 虚拟机设定的上限,并且物理内存充足,SD 卡空间充足 既然内存充足,这时候为什么会有 OOM 崩溃呢? 二、问题描述 在详细描述问题之前,先弄清楚一个问题: 什么导致了 OOM 的产生? 下面是几个关于 Android

对线程池简单理解

爷,独闯天下 提交于 2020-03-20 03:04:03
线程池的好处: 1,因为线程是比较昂贵的资源,避免大量重复创建销毁线程,使用者不用关心创建销毁线程。 2,用户提交的任务能够及时的得到处理,提高响应速度。 3,能够更好的监控和管理线程。 ThreadPoolExecutor参数 int corePoolSize 线程池基本大小 int maximumPoolSize 线程池最大大小 long keepAliveTime 保持活动时间 TimeUnit unit 保持活动时间单位 BlockingQueue workQueue 工作队列 ThreadFactory threadFactory 线程工厂 RejectedExecutionHandler handler 驳回回调 这些参数这样描述起来很空洞,下面结合执行任务的流程来看一下。 ThreadPoolExecutor执行任务流程 当线程池大小 >= corePoolSize 且 队列未满时,这时线程池使用者与线程池之间构成了一个生产者-消费者模型。线程池使用者生产任务,线程池消费任务,任务存储在BlockingQueue中,注意这里入队使用的是offer,当队列满的时候,直接返回false,而不会等待。 keepAliveTime 当线程处于空闲状态时,线程池需要对它们进行回收,避免浪费资源。但空闲多长时间回收呢,keepAliveTime就是用来设置这个时间的。默认情况下