线程数

线程池的正确打开方式

风格不统一 提交于 2020-01-10 11:56:54
欢迎关注微信公众号: 程序员小圈圈 原文首发于: www.zhangruibin.com 本文出自于: RebornChang的博客 转载请标明出处^_^ 线程池的正确打开方式 线程,线程池,多线程,锁,老生常谈的知识点了,涉及很多知识,本节为笔者自己整理的知识点,方便学习记忆,分享出来仅供参考。 线程相关 线程与进程 线程是什么,进程是什么,这是很多初学者的疑问,当然老鸟大神请忽略,这里就简单的比喻下。 如果说把进程比作一条单向路,那线程就是这条路上的通道,比如高速公路单向四通道,可以看成单进程,四线程。 那么所谓的进程线程落到我们电脑硬件上是按什么划分的呢? 我们买电脑的时候,经常看到电脑参数配置里面有这样的介绍: 双核4线,八核16线之类的,这个核就是指的CPU数,几线,就是同时处理的最大线程数,说是八核十六线程的电脑,在使用起来可以达到最大并发16线程,但是,那只是使用起来,究其根本,还是执行的八核八线,只是说在处理速度跟运行效果上,可以达到使用级别的八核十六线,很简单的一个例子,电脑的任务管理器,试试看你的电脑能同时打开几个。 线程的创建和运行方式有几种 如果您是撸了两三年代码的老鸟,这里就可以忽略了。 笼统的来说,线程的创建方式分为四种。 笔者先说下自己知道的,然后具体分为几种,仁者见仁智者见智吧。 第一种,大家公认的,就是继承Thread类进行线程的创建; 第二种

java多线程并发全面解析

六月ゝ 毕业季﹏ 提交于 2020-01-10 11:31:00
线程的创建 有四种方式: 1、实现Runnable接口并重写run()方法 public class StartRun implements Runnable{ public void run() { } } 使用://创建实现类对象 StartRun st=new StartRun(); //创建代理类对象 Thread t=new Thread(st); //启动 开启线程 t.start(); //不保证立即运行,由cpu调用 2、继承Thread类并重写run()方法 public class StartThread extends Thread{ public void run() { } } 使用://创建子类对象 StartThread st=new StartThread(); //启动 开启线程 st.start(); //不保证立即运行,由cpu调用 3、使用Collable并重写call()接口 class Run implements Callable{ //里面是泛型 @Override public Object call() throws Exception { return null; } } 必须使用ExecutorService.submit()方法 调用它 submit会返回一个对象Future,可以使用get()方法来得到该结果 4

ThreadPoolExecutor

限于喜欢 提交于 2020-01-08 16:07:54
ThreadPoolExecutor package com.zhw.learning.thread; import java.util.concurrent.*; /** * @author zhw */ public class ThreadPoolExecutorTest { public static void main(String[] args) { /** * 创建线程池 * java.util.concurrent.ThreadPoolExecutor有多个构造方法, * 我们拿参数最多的构造方法来举例, * 以下是阿里巴巴代码规范中给出的创建线程池的范例 * * corePoolSize: * 线程池核心池大小:用于设定 thread pool 需要时刻保持的最小 core threads 的数量, * 即便这些 core threads 处于空闲状态啥事都不做也不会将它们回收掉 * maximumPoolSize: * 线程池最大线程数量:用于限定 pool 中线程数的最大值。 * 如果你自己构造了 pool 且传入了一个 Unbounded 的 queue 且没有设置它的 capacity, * 那么不好意思,最大线程数会永远 <= corePoolSize,maximumPoolSize 变成了无效的 * keepAliveTime: * 当线程数大于核心时

学习Java并发(01)基本概念

泪湿孤枕 提交于 2020-01-08 15:09:14
前言 在工作中时常接触到并发环境,只是现有的框架已经在底层封装好了,可以直接调用。但总会有一些奇特的场景需要自己手动实现并发,所以了解原理是很重要的。本文用于记录学习并发过程中重要的点或思考。 本文只讨论基本概念,旨在用较为详细易懂的文字记录自己对于并发的一些理解。 什么是并发 并发(Concurrency)是指系统在同一时间段可同时处理多个任务,而同一时刻只有一个任务处于运行状态。 实际上对于单核CPU而言无法实现真正的同时运行多个任务。但是由于CPU运算速度极快,在一个短的时间单位内(比如0.001秒)执行一个任务,执行完马上切换到下一个任务。这样宏观看起来就像是在同时运行多个任务了。 与 并行(Parallel) 的区别:并行是指同一时刻可以同时运行多个任务。现代多核处理器都支持并行运算。并发强调系统支持多个任务同一时刻存在;并行强调系统支持多个任务同时运行。 CPU核心数 可以理解为多处理器,双核CPU从程序的角度来看就等于可共享资源的两个单核处理器。对于单核处理器而言,任一时刻只能处理一个任务;然而多核处理器可以在同一时刻同时处理多个任务。由于现在的CPU基本都支持所谓的 超线程 ,使得一个物理核心可以逻辑上实现两个任务的同时运行(比如Intel的i5处理器通常都是4核8线程,6核12线程),所以程序角度来看一个核心,系统在同一时刻可以同时运行的任务数为:CPU超线程数

Tomcat虚拟主机和优化

邮差的信 提交于 2020-01-07 18:08:47
配置Tomcat虚拟主机和优化 案例需求 1)部署 Tomcat 服务。 2)配置虚拟主机。 3)Tomcat 优化。 4)常见错误分析及处理。 案例实现思路 1)安装 Tomcat 需要的环境。 2)安装 Tomcat 服务。 3)配置虚拟主机。 4)客户端安装压测软件进行压测并调优。 5)常见错误说明。 实验过程 1.下载并安装 JDK,部署Tomcat服务 详情可查看: https://blog.51cto.com/14557905/2464661 2.查看 Tomcat 安装后目录结构 1)bin 存放启动和关闭 Tomcat 的脚本文件, 比较常用的是 catalina.sh、startup.sh、shutdown.sh 三个文件。 2)conf 存放 Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context..xml、tomcat-users.xml、web.xml 四个文件。 3)lib 存放 Tomcat 服务器的 jar 包,一般不作任何改动,除非连接第三方服务,比如 redis, 那就需要添加相对应的 jar 包。 4)logs 存放 Tomcat 日志。 5)temp 存放 Tomcat 运行时产生的文件。 6)webapps 存放项目资源的目录。 7)work Tomcat 工作目录,一般清除 Tomcat 缓存的时候会使用到。

面试汇总

邮差的信 提交于 2020-01-07 11:12:01
一、tomcat的优化--jvm的内存工作原理     Java性能优化的原则:代码的运算性能和内存回收、应用配置。     代码层优化:避免多循环嵌套、调用和复杂逻辑     tomcat的调优的主要内容如下:         增加最大连接数,调整工作模式,启用gzip压缩,调整jvm内存大小,作为web服务器时,与apache整合或nginx,合理选择垃圾回收算法,尽量是由较新jdk版本     生产配置实例:       <Connectorport="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="1000" minSpareThreads="100" maxSpareThreads="200" acceptCount="900" disableUploadTimeout="true" connectionTimeout="20000" URIEncoding="UTF-8" enableLookups="false" redirectPort="8443" compression="on" compressionMinSize="1024" compressableMimeType="text/html,text/xml,text/css,text/javascript"/>  

Spring中@Configuration@EnableAsync@Async用法总结 二

一世执手 提交于 2020-01-07 08:31:53
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 版权声明:本文为原创文章,转载请注明转自Clement-Xu的csdn博客。 这个注解用于标注某个方法或某个类里面的所有方法都是需要异步处理的。被注解的方法被调用的时候,会在新线程中执行,而调用它的方法会在原来的线程中执行。这样可以避免阻塞、以及保证任务的实时性。适用于处理log、发送邮件、短信……等。 注解的应用范围: 类:表示这个类中的所有方法都是异步的 方法:表示这个方法是异步的,如果类也注解了,则以这个方法的注解为准 相关的配置: <task:annotation-driven />配置: executor :指定一个缺省的executor给@Async使用。 例子: <task:annotation-driven executor="asyncExecutor" /> <task:executor />配置参数: id :当配置多个executor时,被@Async(" id ")指定使用;也被作为线程名的前缀。 pool-size : core size :最小的线程数,缺省:1 max size :最大的线程数,缺省:Integer.MAX_VALUE queue-capacity :当最小的线程数已经被占用满后,新的任务会被放进queue里面,当这个queue的capacity也被占满之后

Callable,阻塞队列,线程池问题

浪子不回头ぞ 提交于 2020-01-07 06:56:32
一.说说Java创建多线程的方法   1. 通过继承Thread类实现run方法   2. 通过实现Runnable接口   3. 通过实现Callable接口   4. 通过线程池获取 二. 可以写一个Callable的案例吗?如何调用Callable接口 /*是一个带返回值的多线程类,如果需要有线程返回的结果,就需要使用此类*/ class MyThread implements Callable<Integer> { @Override public Integer call() { return 1000; } } public static void main(String[] args) throws Exception{ /*Thread 构造方法传入 Runnable , FutureTask 构造方法传入 Callable , FutureTask 继承于 RunnableFuture 继承于 Runnable 所以 Thread通过传入FutureTask即Runnable的实现类来启动Callable线程, 透传思想,传接口,不传具体的实现类,可以保证灵活性,(适配器模式) */ FutureTask<Integer> ft = new FutureTask(new MyThread());// 一个是main线程,一个是t1线程 new Thread(ft,

Phaser

馋奶兔 提交于 2020-01-06 16:47:35
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Phaser是一个类型于CountDownLatch和CyclicBarrier的类,但是要比前两个灵活许多,它可以动态变化增加 先说说使用核心:那就是跟CyclicBarrier类似,也是等待的线程数到达一定值时所有线程才可以往下走,但是要比CyclicBarrier更加灵活,它可以动态的控制这个数值。 然后看看使用的核心方法: 跟CyclicBarrier一样可以初始化的时候指定长度,也可以不指定长度 Phaser phaser = new Phaser(); Phaser phaser = new Phaser(1); 通过arriveAndAwaitAdvance()来等待下一阶段的运行 register()和arriveAndDeregister() 这两个方法是用来增加和减少注册量,这个注册量就相当于CyclicBarrier的固定数值。bulkResgister(int) 这方法是批量增加线程数 getPhaser() 可以获取当前是第几阶段,通俗点说就是当前是第几次等待 getArrivedParties()和getUnarrivedParties()这两个方法可以获取到达和未到达该屏障的线程数 isTerminated() 此方法是判断Phaser有没有结束,意思就是注册数是不是为0

java java.util.concurrent.ThreadPoolExecutor 的翻译及解析

…衆ロ難τιáo~ 提交于 2020-01-04 01:10:02
基本描述 ExecutorService 是通过使用一种可能的线程池来执行每个被提交的任务, 一般配置使用 Executors 工厂方法. 线程池设法解决2个问题: 通常提供改良的性能当执行大量异步任务时, 由于减少了每个任务的调用支出以及提供一种约束和管理资源还有容纳当执行任务集合时消费他们的线程的手段. 每个 ThreadPoolExecutor 也维持一些基本的统计,像,已完成任务数量. 对于跨越大范围的上下文很有用,该类提供了很多可适应的参数和有扩展能力的钩子. 然而,程序员被怂恿使用更方便的 Executors 工厂方法 Executors#newCachedThreadPool (无限的线程池,并自动重用线程), Executors#newFixedThreadPool (固定线程大小), Executors#newSingleThreadExecutor (单后台线程), 它们为绝大部分场景预先设置好了. 另外,当手动配置和调制该类时按照下面的向导: 核心及最大线程池的规模(Core and maximum pool sizes) ThreadPoolExecutor 将自动调整线程池的规模(查看 getPoolSize 方法的解释),由核心线程池的规模(查看 getCorePoolSize 的解释),以及最大线程池的规模(查看 getMaximumPoolSize