🎊专栏【JavaSE】
🍔喜欢的诗句:路漫漫其修远兮,吾将上下而求索。
🎆音乐分享【如愿】
🎄欢迎并且感谢大家指出小吉的问题🥰
文章目录
- 🌺以前写多线程的弊端
- 🎄线程池的主要核心原理
- ⭐代码实现
- 🛸创建线程池对象
- 🎈第一种方法—没有上限的线程池
- 🎈第二种方法—有上限的线程池
- 🛸如何验证这个线程池是有上限的
- 🛸方法一
- 🛸方法二—使用debug来验证
- 🍔最大并行数
- 🏳️🌈线程池多大合适
线程池是一种用于管理和复用线程的机制,它可以提高多线程程序的性能和效率。线程池中包含一组预先创建的线程,这些线程可以被重复使用来执行任务,而不需要每次都创建新的线程。
使用线程池的好处有以下几点:
提高性能和效率:线程池可以避免频繁地创建和销毁线程,减少了线程创建的开销,同时可以有效利用系统资源,提高程序的整体性能和效率。
控制并发度:线程池可以限制并发执行的线程数量,防止系统资源被过度占用,避免线程过多导致的系统负荷过大和性能下降。
管理线程生命周期:线程池可以统一管理线程的生命周期,包括线程的创建、销毁以及异常处理等,简化了线程管理的复杂性。
提供任务队列:线程池通常包含一个任务队列,用于存储待执行的任务,可以按照一定的策略对任务进行调度和执行,保证任务的顺序性和稳定性。
在Java中,可以使用java.util.concurrent.Executors类来创建和管理线程池。常用的线程池类型包括:
FixedThreadPool:固定大小的线程池,可指定线程数量。
CachedThreadPool:可根据需要自动调整大小的线程池。
ScheduledThreadPool:用于执行定时任务的线程池。
SingleThreadExecutor:只包含单个线程的线程池。
使用线程池可以简化多线程编程,提高程序的性能和可维护性。但需要注意合理配置线程池的大小和参数,避免资源浪费或线程阻塞等问题
🌺以前写多线程的弊端
用到线程的时候就创建
class Mythread extends Thread{
@override
public void run(){
多线程执行的一些代码
}
}
用完之后线程消失
MyThread t1=new MyThread();
Mythread t2=new Mythread();
t1.start();
t2.start();
🎄线程池的主要核心原理
- 创建一个池子,池子里面的空的
- 提交任务时,池子会插件新的线程对象,
任务执行完毕后,线程归还给池子
,下次再次提交任务的时候,不需要创建新的线程,直接复用已有的线程即可
- 但是如果提交任务的时候,池子中没有空闲线程,也无法创建新的线程,任务就会排队等待
⭐代码实现
🛸创建线程池对象
Executors
实际上第一种是有上限的,是int类型的最大值,只是还没有创建这么大的线程池的时候,电脑先崩溃掉了
获取线程池对象
提交任务
销毁线程池
🎈第一种方法—没有上限的线程池
MyRunnable.java
public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+"---"+i);
}
}
}
Test.java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test {
public static void main(String[] args) {
//1.获取线程池对象
ExecutorService pool1= Executors.newCachedThreadPool();
//2.提交任务
pool1.submit(new MyRunnable());
//3.销毁线程池
pool1.shutdown();
}
}
🎈第二种方法—有上限的线程池
MyRunnable.java
public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+"---"+i);
}
}
}
Test.java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test {
public static void main(String[] args) {
//1.获取线程池对象
ExecutorService pool1= Executors.newFixedThreadPool(3);
//2.提交任务
pool1.submit(new MyRunnable());
pool1.submit(new MyRunnable());
pool1.submit(new MyRunnable());
pool1.submit(new MyRunnable());
pool1.submit(new MyRunnable());
pool1.submit(new MyRunnable());
//3.销毁线程池
//pool1.shutdown();
}
}
🛸如何验证这个线程池是有上限的
🛸方法一
通过观察运行结果,发现虽然提交了6个任务,但是结果中的序号最多为1,这就表示线程池最多有3个线程
🛸方法二—使用debug来验证
再次点击下一步
再次点击下一步
再次点击下一步
再次点击下一步
发现现在池子里面的线程是3不变,但是有一个线程在等待
🍔最大并行数
如何得到电脑处理器的数量
public class Demo {
public static void main(String[] args) {
int count=Runtime.getRuntime().availableProcessors();
System.out.println(count);
}
}
得到结果为12,那么我们接下来操作的最大并行数就是12
🏳️🌈线程池多大合适
如果大家有不明白的地方,欢迎在评论区进行讨论