参考这个课程,讲的非常详细
应用场景
商品秒杀
文件上传
订票系统
自定义线程池(让我们了解底层逻辑的)
构造方法
饱和机制
就是我们的队列饱和后我们该怎么处理
是拒绝这个任务还是啥
工作流程介绍
参数设计和分析
核心线程数量和任务队列长度
最大线程数和最大空闲时间
线程类和任务类代码实现
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类型
然后这个里面有我们的异步计算结果,可以根据它来进行操作
结束后记得关闭线程池