java自定义线程池的原理简介
线程池的相关概念就不在这里说明了,百度一下有很多,这里简单表述一下如何实现一个自定义的线程池就行线程管理,我们如果要实现一个线程池对线程的管理,那么需要实现一下几点的思路:
1.如何管理线程
2.如何定义工作线程以及工作线程如何持续的保持运行状态
3.如何定义线程池大小及队列大小
4.如何提供接口给调用者使用
5.如何关闭线程池中的线程
接下来我们就一一的实现这几个问题。
1.我们需要定义一个队列来来管理线程,这里使用了LinkedBlockingQueue
//1.定义一个存储线程队列 privateLinkedBlockingQueuequeue;
2.因为是一个简单的测试,所以我们可以先定义一个内部类来实现工作线程
//2.定义工作线程进行线程的执行
classWorkerextendsThread{
privateSelfThreadPoolExecutorthreadPoolExecutor;
publicWorker(SelfThreadPoolExecutorpoolExecutor){
this.threadPoolExecutor=poolExecutor;
}
@Override
publicvoidrun(){
Runnabletask;
while(threadPoolExecutor.receiveTask||threadPoolExecutor.queue.size()>0){
try{
//有线程则取出来,否则等待
System.out.println("准备消费线程");
task=threadPoolExecutor.queue.take();
if(task!=null){
task.run();
System.out.println("消费线程");
}
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}
SelfThreadPoolExecutor是外部定义的整体类名
3.使用有参的构造方法进行线程池大小的管理
//3.存放工作线程的集合 privateListworkerList; //4.线程池初始化 publicSelfThreadPoolExecutor(intcoreSize,intqueueSize){ if(coreSize<=0||queueSize<=0){ thrownewIllegalArgumentException("参数不正确"); } this.queue=newLinkedBlockingQueue<>(queueSize); //线程安全的集合 this.workerList=Collections.synchronizedList(newArrayList<>()); for(inti=0;i 4.定义阻塞和非阻塞的方式提供对应的接口
//5.非阻塞的方法接口 publicbooleanoffer(Runnabletask){ if(receiveTask){ returnqueue.offer(task); }else{ returnfalse; } } //6.阻塞的方法接口 publicvoidput(Runnabletask){ try{ if(receiveTask){ queue.put(task); } }catch(InterruptedExceptione){ e.printStackTrace(); } }6.进行线程池的关闭
//7.线程池的关闭 privatebooleanreceiveTask=true; publicvoidshutdown(){ //7.1.队列不再接收线程 receiveTask=false; //7.2.关闭处于wait或block的线程 for(Threadthread:workerList){ if(Thread.State.BLOCKED.equals(thread.getState()) ||Thread.State.WAITING.equals(thread.getState()) ||Thread.State.TIMED_WAITING.equals(thread.getState())){ thread.interrupt(); } } }我们测试的方法如下:
publicstaticvoidmain(String[]args){ SelfThreadPoolExecutorselfThreadPoolExecutor=newSelfThreadPoolExecutor(5,10); for(inti=0;i<20;i++){ Runnabletask=()->{ System.out.println("开启线程"); }; selfThreadPoolExecutor.put(task); } selfThreadPoolExecutor.shutdown(); }运行结果是:
准备消费线程 准备消费线程 准备消费线程 准备消费线程 准备消费线程 开启线程 消费线程 准备消费线程 开启线程 消费线程 准备消费线程 开启线程 消费线程 准备消费线程 。。。。。。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
热门推荐
10 香港老妈结婚祝福语简短
11 毕业立体贺卡祝福语简短
12 简短新年年会祝福语
13 评论小品祝福语大全简短
14 恭喜师兄结婚祝福语简短
15 员工集体辞职祝福语简短
16 高中新生祝福语 简短
17 装修祝福语男生搞笑简短
18 生日开业蛋糕祝福语简短