【从入门到起飞】JavaSE—多线程(3)(线程池,最大并行数)

🎊专栏【JavaSE】
🍔喜欢的诗句:路漫漫其修远兮,吾将上下而求索。
🎆音乐分享【如愿】
🎄欢迎并且感谢大家指出小吉的问题🥰


线程池是一种用于管理和复用线程的机制,它可以提高多线程程序的性能和效率。线程池中包含一组预先创建的线程,这些线程可以被重复使用来执行任务,而不需要每次都创建新的线程。

使用线程池的好处有以下几点:

提高性能和效率:线程池可以避免频繁地创建和销毁线程,减少了线程创建的开销,同时可以有效利用系统资源,提高程序的整体性能和效率。
控制并发度:线程池可以限制并发执行的线程数量,防止系统资源被过度占用,避免线程过多导致的系统负荷过大和性能下降。
管理线程生命周期:线程池可以统一管理线程的生命周期,包括线程的创建、销毁以及异常处理等,简化了线程管理的复杂性。
提供任务队列:线程池通常包含一个任务队列,用于存储待执行的任务,可以按照一定的策略对任务进行调度和执行,保证任务的顺序性和稳定性。
在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();

🎄线程池的主要核心原理

  1. 创建一个池子,池子里面的空的
  2. 提交任务时,池子会插件新的线程对象,任务执行完毕后,线程归还给池子,下次再次提交任务的时候,不需要创建新的线程,直接复用已有的线程即可
  3. 但是如果提交任务的时候,池子中没有空闲线程,也无法创建新的线程,任务就会排队等待

⭐代码实现

🛸创建线程池对象

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

🏳️‍🌈线程池多大合适

在这里插入图片描述

如果大家有不明白的地方,欢迎在评论区进行讨论

  • 33
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在下小吉.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值