• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

11.1 线程池简介

线程池(英文: thread pool) : A线程使用模式。线程太多会带来调度开销,影响缓存局部性和整体性能。线程池维护多个线程,等待管理程序分配可以并发执行的任务。这避免了在处理短期任务时创建和销毁线程的开销。线程池既能保证内核的充分利用,又能防止过度调度。

例:十年前的单核CPU计算机,假多线程,像马戏团小丑一样打多个球,CPU需要来回切换。现在是多核电脑,多线程运行在独立的CPU上,不用切换就很高效。

线程池:的优点只要线程池所做的工作是控制运行线程的数量,它就在处理时将任务放入队列,然后在线程创建后启动这些任务。如果线程数量超过最大数量,超出的线程将排队等待,然后在其他线程完成时从队列中取出任务执行。

它的主要特点为:

减少资源消耗:通过重用已创建的线程,减少线程创建和销毁造成的消耗。

提高响应速度:当任务到达时,无需等待线程创建即可立即执行任务。

提高线程的可管理性。3360线程是稀缺资源。如果无限制地创建它们,不仅会消耗系统资源,还会降低系统的稳定性。使用线程池可以进行统一分配、调优和监控。

Java 中的线程池是通过Executor框架实现的,该框架中用到了Executor , Executors,ExecutorService , ThreadPoolExecutor这几个类

UML类图:

3cw0htzzt5b5077.png

5xenne2r4fp5078.png

uhnm1irpgst5079.png

包JUC.pool

导入Java . util . concurrent . executorservice;

导入Java . util . concurrent . executors;

//演示线程池的三种常见分类

公共类ThreadPoolDemo1 {

公共静态void main(String[] args) {

//一个有五个线程的池

//5个窗口

ExecutorService thread pool 1=executors . newfixedthreadpool(5);

//一个池和一个线程

//1个窗口

ExecutorService thread pool 2=executors . newsinglethreadexecutor();

//可扩展线程池

ExecutorService thread pool 3=executors . newcachedthreadpool();

//10个客户请求

尝试{

for(int I=1;i=20i ) {

//执行

threadPool3.execute(() - {

system . out . println(thread . current thread()。getname()'办理业务');

});

}

} catch(异常e) {

e . printstacktrace();

}最后{

//关闭

thread pool 3 . shut down();

}

}

}

11.2 线程池七个参数介绍

ehdtweaw0oz5080.png

iurwhhxbjrb5081.png

11.3 线程池工作流程和拒绝策略

xilfbev4lul5082.png

工作流程如上图所示:以银行窗口服务的客户为例,常驻线程数为2,相当于两个窗口一直开着。线程数最大为5,最多相当于5个窗口,阻塞队列为3,最多相当于等待区的3个位置。当窗口1和2为客户服务时,等待区挤满了客户3、4和5。这时候客户6、7、8到了,大堂经理会单独为他们服务,相当于创建了线程6、7、8(相当于打开了窗口6、7、8)。此时,已达到最大线程数。如果客户9再来,就执行拒绝策略。拒绝策略参考下图。

52ltxpiindq5083.png

AbortPolicy:银行服务不了客户,就让客户去其他银行办理。(客户9)

CallerRunsPolicy:谁让客户来银行,就让他们去找谁。(客户9)

DiscardOldestPolicy:让银行等候区等候时间最长的客户离开。(顾客5离开,顾客9进来)

废弃政策:忽视顾客。(客户9)

11.4 自定义线程池

cp4exvr1ivv5084.png

包JUC.pool

导入Java . util . concurrent . *;

//自定义线程池创建

公共类ThreadPoolDemo2 {

公共静态void main(String[] args) {

threadPool executor threadPool=new threadPool executor(

2,

5,

2L,

时间单位。秒,

新的ArrayBlockingQueue(3),

Executors.defaultThreadFactory(),

新建ThreadPoolExecutor。abort policy());

//10个客户请求

尝试{

for(int I=1;i=10i ) {

//执行

threadPool.execute(() - {

系统。出去。println(线程。当前线程().getName()'办理业务');

});

}

} catch(异常e) {

e。printstacktrace();

}最后{

//关闭

线程池。关闭();

}

}

}

Link to comment
Share on other sites