Java中线程池的基本使用

avatar
作者
猴君
阅读量:0

参考这个课程,讲的非常详细 



27.线程池使用步骤总结_哔哩哔哩_bilibili

应用场景

商品秒杀
 

文件上传
 

订票系统


自定义线程池(让我们了解底层逻辑的)


 

构造方法


 

饱和机制
 

就是我们的队列饱和后我们该怎么处理
 

是拒绝这个任务还是啥

 

工作流程介绍




 


 


 

参数设计和分析
 

核心线程数量和任务队列长度


 


 

最大线程数和最大空闲时间



 

线程类和任务类代码实现


 


 

MyTask 是我们的线程类,我们连接了Runnable接口


 

MyWork是我们的任务执行类,连接Thread接口,里面执行run()方法


 

线程类和测试类编写
 

线程池类


 


 


 


 

提交任务,我们把任务扔到List队列里面


 


 

执行任务


 



 

测试类
 


 

逻辑
 

MyTasks提交任务给线程池MythreadPool
 

MyThreadPool再用任务类MyWorker来执行
总结

用.start()调用MyWorker类里面的run方法
 

传过去的Runnable类型,是Task任务类,我们用start()调用里面的run()方法


Java内置线程池

ExecutorService介绍
 


 


 

Executors工厂类介绍
 


 


 

newCachedThreadPool() 创建一个默认的线程池对象,里面的线程可重用,且在第一次使用时才创建
 

newCachedThreadPool(ThreadFacotry threadfactory)线程池中的所有线程都使用ThreadFacotry来创建,这样的线程无需手动启动,自动执行
 


 

newFixThreadPool() 创建一个可重用固定线程数的线程池
 

newFixThreadPool(ThreadFacotry threadfactory) 创建一个可重用固定线程数的线程池,且线程池中的所有线程都使用ThreadFacotry来创建
 


 

newSingleThreadExecutor() 创建一个使用单个worker线程的Executor,以无界队列方式来运行该线程
 

newSingleThreadExecutor(ThreadFacotry threadfactory)
 

创建一个使用单个worker线程的Executor,且线程池中的所有线程都使用ThreadFacotry来创建
 


 

newCachedThreadPool()获取ExcecutorService并且提交任务


 


 

反正就是,要执行的类,要连接Runnable接口,然后把这个连接了Runnable接口的类传给线程池
 

使用工厂类来创建线程池对象
 

control+p,观察一下形参


 

new ThreadFactory(),实现一个匿名内部类方法


 

然后我们的内部是return一个Thread
 

这里面的形参可以指定我们的线程的名称等等


无限个线程


newFixedThreadPool


 

加多了个指定线程数量


 


 

指定了3个线程,所以最多用到3个线程
 

Single,只有一个线程


 


 


 


 

shutDown和shutDownNow方法


 

shutDown,不能再提交新的任务了


 


 

shutDownNow


 

ScheduleExecutorService获取方式和常用方法介绍
 

如果我们还有其他需求
 

例如我们提交后我们想延迟一段时间
 

或者我们想每次间隔一段时间

 

允许延时任务和定时任务


 


 

延迟执行任务入门练习
 

我们的延迟任务不用start()了,用schedule(任务,延迟时间,时间的单位)


 


 

scheduleAtFixedRate()方法执行任务
 


 

如果我们用ThreadFactory()工厂创建后
 

我们用scheduleAtFixRate()来提交任务

 

scheduleWithFixedDelay()方法执行任务
 

和上面那种方法的不同,在于时间间隔的不同


 

任务执行时间不记录到间隔时间之内
 

任务结束之后才开始计算时间

 

Single线程池用这个方法调用


 



 

总结


 


Future介绍(异步计算结果)
 



 

submit()方法里面


 

形参是Callable类型
 

或者Runnable类型
 

是有返回值的
 



 

这个返回值就是我们的异步计算结果
 

有时候我们需要获取线程的计算结果来进行计算


 

方法

cancel()
 

get()
 

isCancelled()
 

isDone()
 


 

Future代码展示
 


 


 

submit()的返回值类型是Callable类型
 

也就是我们的Future类型
 

然后这个里面有我们的异步计算结果,可以根据它来进行操作
 

结束后记得关闭线程池



 


 


 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!