Java中线程池的基本使用

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



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类型
 

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

结束后记得关闭线程池



 


 


 

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java语言线程池可以通过`java.util.concurrent.Executors`类来创建和管理。线程池可以提高程序的性能和资源利用率,通过重用线程避免了线程的频繁创建和销毁。 下面是一个简单的示例来演示线程池使用: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolExample { public static void main(String[] args) { // 创建一个固定大小的线程池,大小为5 ExecutorService executor = Executors.newFixedThreadPool(5); for (int i = 0; i < 10; i++) { final int taskId = i; executor.execute(new Runnable() { public void run() { System.out.println("Task " + taskId + " is running."); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Task " + taskId + " is completed."); } }); } // 关闭线程池 executor.shutdown(); } } ``` 在上述示例,我们使用`Executors.newFixedThreadPool()`方法创建了一个固定大小为5的线程池。然后,我们使用`execute()`方法向线程池提交了10个任务(通过`Runnable`接口的实现类),每个任务会打印出任务编号,并休眠2秒钟来模拟任务执行时间。最后,我们调用`shutdown()`方法关闭线程池。 这只是线程池基本使用方法,Java还提供了其他类型的线程池,如`CachedThreadPool`和`ScheduledThreadPool`,以满足不同的需求。你可以根据具体场景选择合适的线程池类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值