threadpool

Java之——使用JMX监控Tomcat

旧巷老猫 提交于 2020-04-13 16:55:52
【今日推荐】:为什么一到面试就懵逼!>>> 转载请注明出处:http://blog.csdn.net/l1028386804/article/details/51547408 2016年5月的最后一天,今天我将和大家分享Java中如何使用JMX来监控Tomcat的各种状态。好了,不多说了,我们直接进入主题 一、激活Tomcat的JMX远程配置 要通过JMX远程监控Tomcat,首先需要激活Tomcat的JMX远程配置。 ① 修改脚本 先修改Tomcat的启动脚本,windows下为bin/catalina.bat(linux下为catalina.sh),添加以下内容,8999是jmxremote使用的端口号,第二个false表示不需要鉴权: set JMX_REMOTE_CONFIG=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false set CATALINA_OPTS=%CATALINA_OPTS% %JMX_REMOTE_CONFIG% 要注意以上语句的位置不能太后面,可以加在【if "%OS%" ==

多线程之旅(Task 任务)

别等时光非礼了梦想. 提交于 2020-04-12 07:31:43
一、Task(任务)和ThreadPool(线程池)不同 源码   1、线程(Thread)是创建并发工具的底层类,但是在前几篇文章中我们介绍了Thread的特点,和实例。可以很明显发现局限性(返回值不好获取(必须在一个作用域中)),当我们线程执行完之后不能很好的进行下一次任务的执行,需要多次销毁和创建,所以不是很容易使用在多并发的情况下。   2、线程池(ThreadPool) QueueUserWorkItem是很容易发起并发任务,也解决了上面我们的需要多次创建、销毁的性能损耗解决了,但是我们就是太简单的,我不知道线程什么时候结束,也没有获取返回值的途径,也是比较尴尬的事情。   3、任务(Task)表示一个通过或不通过线程实现的并发操作, 任务 是可组合的,使用 延续(continuation) 可将它们串联在一起,它们可以使用线程池减少启动延迟,可使用回调方法避免多个线程同时等待I/O密集操作。 二、初识Task(任务)   1、Task(任务)是在.NET 4.0引入的、Task是在我们线程池ThreadPool上面进行进一步的优化,所以Task默认还是线程池线程,并且是后台线程,当我们的主线程结束时其他线程也会结束   2、Task创建任务,也和之前差不多 /// <summary> /// Task 的使用 /// Task 的创建还是差不多的 /// <

Rust编程知识拾遗:Rust 编程,Option 学习

此生再无相见时 提交于 2020-04-10 15:31:48
视频地址 头条地址:https://www.ixigua.com/i6765442674582356483 B站地址:https://www.bilibili.com/video/av78062009?p=1 网易云课堂地址:https://study.163.com/course/introduction.htm?courseId=1209596906#/courseDetail?tab=1 github地址 github地址 介绍 Option类型代表了一个可选的值,每个Option要么是一个Some中包含一个值,要么是一个None。Option的定义如下: pub enum Option<T> { None, Some(T), } 用法 Option主要有以下一些用法: 初始化值; 作为在整个输入范围内没有定义的函数的返回值; 作为返回值,用 None 表示出现的简单错误; 作为结构体的可选字段; 作为结构体中可借出或者是可载入的字段; 作为函数的可选参数; 代表空指针; 用作复杂情况的返回值。 此处,我们举例说明一下“ 作为结构体可借出或者是可载入的字段 ”。 use std::thread; use std::time::Duration; struct Worker { thread: thread::JoinHandle<()>, } impl Worker { fn

Django异步任务线程池

╄→尐↘猪︶ㄣ 提交于 2020-04-09 00:56:00
当数据库数据量很大时(百万级),许多批量数据修改请求的响应会非常慢,一些不需要即时响应的任务可以放到后台的异步线程中完成,发起异步任务的请求就可以立即响应 选择用线程池的原因是:线程比进程更为可控。不像子进程,子线程会在所属进程结束时立即结束。线程可共享内存。 请求任务异步处理的原理 使用 python manage.py runserver 模式启动的Django应用只有一个进程,对于每个请求,主线程会开启一个子线程来处理请求。请求子线程向主线程申请一个新线程,然后把耗时的任务交给新线程,自身立即响应,这就是请求任务异步处理的原理。 可视化线程池 如果想要管理这批异步线程,知道他们是否在运行中,可以使用线程池(ThreadPoolExecutor)。 线程池会先启动若干数量的线程,并让这些线程都处于睡眠状态,当向线程池submit一个任务后,会唤醒线程池中的某一个睡眠线程,让它来处理这个任务,当处理完这个任务,线程又处于睡眠状态。 submit任务后会返回一个期程(future),这个对象可以查看线程池中执行此任务的线程是否仍在处理中 因此可以构建一个全局可视化线程池: from concurrent.futures.thread import ThreadPoolExecutor class ThreadPool(object): def __init__(self): #

面试刷题18:死锁是怎么产生的?如何定位修复?

a 夏天 提交于 2020-04-06 18:48:20
<br /> <br /> <br />死锁是并发编程的难点问题。<br /> <br /> <br />大家好,我是李福春,我在准备面试,今天的问题是:<br /> <br />死锁是如何产生的?如何定位?如何修复和避免?<br /> <br />答:死锁是一种特定的程序状态,一般是多线程场景下两个以上的线程互相持有对方需要的锁而处于的永久阻塞状态。<br /> <br />定位方法:jstack分析线程的栈信息可以定位出来; 或者使用ThreadMXBean相关的api在程序中打印出相关的死锁信息;<br /> <br />修复和规避:死锁问题一般无法在线解决,一般紧急的先重启应用保证可用;然后在开发环境采用互相代码审查,使用预防性工具比如finBugs提前发现可能发生死锁的程序,修复程序本身的问题。<br /> <br /> <br /> <br /> 死锁的产生和定位 <br />死锁的产生场景场景如下图:<br /> <br /> <br /> <br /> 死锁代码示例 package org.example.mianshi.deadlock; import java.util.concurrent.TimeUnit; /** * 作者: carter * 创建日期: 2020/3/30 12:09 * 描述: 死锁例子 */ public class

C#的Timer

梦想与她 提交于 2020-04-06 08:31:47
在C#里现在有3个Timer类: System.Windows.Forms.Timer System.Threading.Timer System.Timers.Timer 这三个Timer我想大家对 System.Windows.Forms.Timer 已经很熟悉了,唯一我要说的就是这个Timer在激发Timer.Tick事件的时候,事件的处理函数是在程序主线程上执行的,所以在WinForm上面用这个Timer很方便,因为在Form上的所有控件都是在程序主线程上创建的,那么在Tick的处理函数中可以对Form上的所有控件进行操作,不会造成WinForm控件的线程安全问题。 1、Timer运行的核心都是System.Threading.ThreadPool 在这里要提到ThreadPool(线程池)是因为,System.Threading.Timer 和System.Timers.Timer运行的核心都是线程池,Timer每到间隔时间后就会激发响应事件,因此要申请线程来执行对应的响应函数,Timer将获取线程的工作都交给了线程池来管理,每到一定的时间后它就去告诉线程池:“我现在激发了个事件要运行对应的响应函数,麻烦你给我向操作系统要个线程,申请交给你了,线程分配下来了你就运行我给你的响应函数,没分配下来先让响应函数在这儿排队(操作系统线程等待队列)”,消息已经传递给线程池了

死磕 java线程系列之自己动手写一个线程池

时间秒杀一切 提交于 2020-03-23 16:48:21
3 月,跳不动了?>>> (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写的线程池如何测试? 简介 线程池是Java并发编程中经常使用到的技术,那么自己如何动手写一个线程池呢?本文彤哥将手把手带你写一个可用的线程池。 属性分析 线程池,顾名思义它首先是一个“池”,这个池里面放的是线程,线程是用来执行任务的。 首先 ,线程池中的线程应该是有类别的,有的是核心线程,有的是非核心线程,所以我们需要两个变量标识核心线程数量coreSize和最大线程数量maxSize。 为什么要区分是否为核心线程呢?这是为了控制系统中线程的数量。 当线程池中线程数未达到核心线程数coreSize时,来一个任务加一个线程是可以的,也可以提高任务执行的效率。 当线程池中线程数达到核心线程数后,得控制一下线程的数量,来任务了先进队列,如果任务执行足够快,这些核心线程很快就能把队列中的任务执行完毕,完全没有新增线程的必要。 当队列中任务也满了,这时候光靠核心线程就无法及时处理任务了,所以这时候就需要增加新的线程了,但是线程也不能无限制地增加,所以需要控制其最大线程数量maxSize。 其次 ,我们需要一个任务队列来存放任务,这个队列必须是线程安全的,我们一般使用BlockingQueue阻塞队列来充当,当然使用ConcurrentLinkedQueue也是可以的

ThreadPoolExecutor线程池参数设置技巧

走远了吗. 提交于 2020-03-23 16:38:57
3 月,跳不动了?>>> 一、ThreadPoolExecutor的重要参数 corePoolSize:核心线程数 核心线程会一直存活,及时没有任务需要执行 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理 设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭 queueCapacity:任务队列容量(阻塞队列) 当核心线程数达到最大时,新任务会放在队列中排队等待执行 maxPoolSize:最大线程数 当线程数>=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务 当线程数=maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常 keepAliveTime:线程空闲时间 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize 如果allowCoreThreadTimeout=true,则会直到线程数量=0 allowCoreThreadTimeout:允许核心线程超时 rejectedExecutionHandler:任务拒绝处理器 两种情况会拒绝处理任务: 当线程数已经达到maxPoolSize,切队列已满,会拒绝新任务 当线程池被调用shutdown()后,会等待线程池里的任务执行完毕,再shutdown

别再 select * 了,送你 12 个查询技巧!

时光怂恿深爱的人放手 提交于 2020-03-18 13:08:14
某厂面试归来,发现自己落伍了!>>> 作者:AIOps 前端 应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。 那么如何提高数据库SQL语句执行速度呢?有人会说性能调优是数据库管理员(DBA)的事,然而性能调优跟程序员们也有莫大的关系。 image 程序中嵌入的一行行的SQL语句,如果使用了一些优化小技巧,定能达到事半功倍的效果。 技巧1 比较运算符能用 “=”就不用“<>” “=”增加了索引的使用几率。 技巧2 明知只有一条查询结果,那请使用 “LIMIT 1” “LIMIT 1”可以避免全表扫描,找到对应结果就不会再继续扫描了。 技巧3 为列选择合适的数据类型 能用TINYINT就不用SMALLINT,能用SMALLINT就不用INT,道理你懂的,磁盘和内存消耗越小越好嘛。 技巧4 将大的DELETE,UPDATE or INSERT 查询变成多个小查询 能写一个几十行、几百行的SQL语句是不是显得逼格很高?然而,为了达到更好的性能以及更好的数据控制,你可以将他们变成多个小查询。 image 技巧5 使用UNION ALL 代替 UNION,如果结果集允许重复的话 因为 UNION ALL 不去重,效率高于 UNION。 技巧6 为获得相同结果集的多次执行,请保持SQL语句前后一致 这样做的目的是为了充分利用查询缓冲

java线程池ThreadPoolExecutor

ぐ巨炮叔叔 提交于 2020-03-12 12:45:55
一、简介 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: Java代码 ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler) corePoolSize: 线程池维护线程的最少数量 (core : 核心) maximumPoolSize:线程池维护线程的最大数量 keepAliveTime: 线程池维护线程所允许的空闲时间 unit: 线程池维护线程所允许的空闲时间的单位 workQueue: 线程池所使用的缓冲队列 handler: 线程池对拒绝任务的处理策略 一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。 当一个任务通过execute(Runnable)方法欲添加到线程池时: 如果线程池中 运行的线程 小于corePoolSize ,即使线程池中的线程都处于空闲状态,也要 创建新的线程 来处理被添加的任务。