线程池参数设置|线程池参数设置技巧

线程池参数设置|线程池参数设置技巧

1. 线程池参数设置技巧

也就是说,一个用户登陆应用系统进行某操作,则WebLogic将从weblogic.kernel.default中分配一个线程给该用户。默认情况下,这个参数值是40。比如对大的企业应用,同一时间登陆操作系统的用户非常多,则40个线程就显得太少了

2. 线程池的七个参数配置

注意点

1.创建线程是存在开销的,注意创建开销对性能损耗

2.大量的线程由于上下文切换造成程序的性能的降低

3.耗时的业务操作放在子线程,防止主线程阻塞

4.注意多线程带来的各种数据安全问题

5.防止多线程在资源竞争的过程中出现死锁

6.使用线程池维护线程需要注意构造器参数的配置,比如核心线程数,拒绝策略

希望我的回答对你有所帮助

3. 如何设置线程池参数比较合理

一、线程池的作用:

线程池作用就是限制系统中执行线程的数量。

根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。

二、如何使用:

要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。

1. newSingleThreadExecutor创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

2.newFixedThreadPool创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

3. newCachedThreadPool创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。4.newScheduledThreadPool创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

三、为什么要用线程池:

1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。

4. 线程池线程数设置

1、多进程模型的优缺点

(1)优点:

1)每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;

2)通过增加CPU,就可以容易扩充性能;

3)可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;

4)每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大。

(2)缺点:

1)逻辑控制复杂,需要和主程序交互;

2)需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算 ;

3)多进程调度开销比较大。

2、多线程模型的优缺点

(1)优点:

1)无需跨进程边界;

2)程序逻辑和控制方式简单;

3)所有线程可以直接共享内存和变量等;

4)线程方式消耗的总资源比进程方式好;

(2)缺点:

1)每个线程与主程序共用地址空间,受限于2GB地址空间;

2)线程之间的同步和加锁控制比较麻烦;

3)一个线程的崩溃可能影响到整个程序的稳定性;

4)到达一定的线程数程度后,即使再增加CPU也无法提高性能,

5)线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU 。

3、I/O多路复用的优缺点

(1)优点:

1)相比于多线程和多进程,I/O多路复用是在单一进程的上下文中的,当有多个并发连接请求时,多线程或者多进程模型需要为每个连接创建一个线程或者进程,而这些进程或者线程中大部分是被阻塞起来的。由于CPU的核数一般都不大,比如4个核要跑1000个线程,那么每个线程的时间槽非常短,而线程切换非常频繁。这样是有问题的。而使用I/O多路复用时,处理多个连接只需要1个线程监控就绪状态,对就绪的每个连接开一个线程处理(由线程池支持)就可以了,这样需要的线程数大大减少,减少了内存开销和上下文切换的CPU开销。

2)整个过程只在调用select、poll、epoll这些调用的时候才会阻塞,收发客户消息是不会阻塞的,整个进程或者线程就被充分利用起来,这就是事件驱动。

(2)缺点:

单线程模型不能有阻塞,一旦发生任何阻塞(包括计算机计算延迟)都会使得这个模型不如多线程。另外,单线程模型不能很好的利用多核cpu。

5. 线程池参数如何设置

多线程是为了能够让计算机资源合理的分配,对于处理不同的任务创建不同的线程进行处理,但是计算机创建一个线程或者销毁一个线程所花费的也是比较昂贵的,有时候需要同时处理的事情比较多,就需要我们频繁的进行线程的创建和销毁,这样花费的时间也是比较多的。为了解决这一问题,我们就可以引用线程池的概念。

所谓线程池就是将线程集中管理起来,当需要线程的时候,可以从线程池中获取空闲的线程,这样可以减少线程的频繁创建与销毁,节省很大的时间和减少很多不必要的操作。

在java中提供了ThreadPoolExecutor类来进行线程的管理,这个类继承于AbstractExecutorService,而AbstractExecutorService实现了ExecutorService接口,我们可以使用ThreadPoolExecutor来进行线程池的创建。

在ThreadPoolExecutor的构造方法中,有多个参数,可以配置不同的参数来进行优化。这个类的源码构造方法为:

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)其中每个参数代表的意义分别为:

corePoolSize : 线程池中的核心线程数量,当线程池中当前的线程数小于这个配置的时候,如果有一个新的任务到来,即使线程池中还存在空闲状态的线程,程序也会继续创建一个新的线程放进线程池当中

maximumPoolSize: 线程池中的线程最大数量

keepAliveTime:当线程池中的线程数量大于配置的核心线程数量(corePoolSize)的时候,如果当前有空闲的线程,则当这个空闲线程可以存在的时间,如果在keepAliveTime这个时间点内没有新的任务使用这个线程,那么这个线程将会结束,核心线程不会结束,但是如果配置了allowCoreThreadTimeOut = true,则当空闲时间超过keepAliveTime之后,线程也会被结束调,默认allowCoreThreadTimeOut = false,即表示默认情况下,核心线程会一直存在于线程池当中。

unit : 空闲线程保持连接时间(keepAliveTime)的时间单位

workQueue:阻塞的任务队列,用来保存等待需要执行的任务。

threadFactory :线程工厂,可以根据自己的需求去创建线程的对象,设置线程的名称,优先级等属性信息。

handler:当线程池中存在的线程数超过设置的最大值之后,新的任务就会被拒绝,可以自己定义一个拒绝的策略,当新任务被拒绝之后,就会使用hander方法进行处理。

在java中也提供了Executors工具类,在这个工具类中提供了多个创建线程池的静态方法,其中包含newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor等。但是他们每个方法都是创建了ThreadPoolExecutor对象,不同的是,每个对象的初始 参数值不一样;

6. 线程池的基本参数

当某一个资源使用完后,资源池把相关的资源的忙标示清除掉,以示该资源可以再被下一个请求使用。

1.资源池引入的目的

提高性能

2.资源池运作机制

由资源池管理器提供一定数目的目标资源,当有请求该资源时,资源池分配给一个,然后给该资源标识为忙, 标 示为忙的资源不能再被分配使用,

3.资源池常有的参数

1.初始资源的数目:资源池启动时,一次建立的资源数目,资源池最少要保证在这个数目上

2.最大资源的数目:当请求的资源超出这个数目,就等待

4.常见的资源池

1.数据库连接池

2.web容器中的request,response对象池

3.web容器中的线程池

4.C语言内存池

7. java线程池参数设置

Jdk中的juc并发包下面包含Java线程池相关的类,有四种线程池,支持设置核心线程数,最大线程数,等待队列和拒绝策略。

其中核心线程处理完任务后线程的run方法并没有立刻结束,而是阻塞并不停尝试从队列中取任务来处理。

8. 线程池运行流程,参数,策略

c# threadpool和线程池其实是一样的,前者是后者的英文名,没区别

推荐阅读