7、多线程5

本文介绍了Java线程池的概念、优点,详细讲解了线程池的创建方法,包括固定大小、缓存、定时任务等实现,并探讨了线程池的使用策略和拒绝策略,以及线程池状态转换,帮助开发者理解和优化线程资源管理。
摘要由CSDN通过智能技术生成

一、传统线程的缺点:

1.创建线程需要开辟本地线程栈、虚拟机栈、程序计数器等私有线程内存,消耗的时候也需要释放这
些内存,频繁的创建和销毁线程是需要消耗系统资源的;
2.线程没有任务管理的功能, 当任务量远远⼤于线程可以承载的数量之后,不能对任务进行管理或者拒绝任务。

二、线程池是什么

线程池(ThreadPool)是⼀种基于池化思想管理和使⽤线程的机制。
它是将多个线程预先存储在⼀个“池⼦”内,当有任务出现时可以避免重新创建和销毁线程所带来性能开销,只需要从“池⼦”内取出相应的线程执⾏对应的任务即可。

池化思想在计算机的应⽤也⽐较⼴泛,⽐如以下这些:
内存池(Memory Pooling):预先申请内存,提升申请内存速度,减少内存碎⽚。
连接池(Connection Pooling):预先申请数据库连接,提升申请连接的速度,降低系统的开销。
实例池(Object Pooling):循环使⽤对象,减少资源在初始化和释放时的昂贵损耗。

三、线程池的优点

1.降低资源消耗:通过池化技术重复利⽤已创建的线程,降低线程创建和销毁造成的损耗。
2. 提⾼响应速度:任务到达时,⽆需等待线程创建即可⽴即执⾏。
3. 提⾼线程的可管理性:线程是稀缺资源,如果⽆限制创建,不仅会消耗系统资源,还会因为线程的不合理分布导致资源调度失衡,降低系统的稳定性。使⽤线程池可以进⾏统⼀的分配、调优和监控,从而可以实现任务缓存和任务拒绝的情况。
4. 提供更多更强⼤的功能:线程池具备可拓展性,允许开发⼈员向其中增加更多的功能。⽐如延时定时线程池ScheduledThreadPoolExecutor,就允许任务延期执⾏或定期执⾏。
5. 控制线程数量,从而避免了因为线程创建过的而导致内存溢出(OOM)的问题。
在这里插入图片描述

四、线程池的使用:

两种实现方式:

1.通过ThreadPoolExecutor手动创建线程池(有一种实现方法)。
2.使用Executors自动创建线程池(共有6种实现方法)。

七种实现方法:

在这里插入图片描述

1.创建一个固定大小的线程池: Executors.newFixedThreadPool

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 创建一个固定大小的线程池
 */
public class ThreadPoolDemo1 {
   
    public static void main(String[] args) {
   
        //1.创建了一个包含5个线程的线程池
        ExecutorService threadPool= Executors.newFixedThreadPool(5);
        //2.使用线程池执行任务
//        for (int i = 0; i < 5; i++) {
   
            //给线程池添加任务(使用线程池执行任务)
            //方法1
//            threadPool.submit(new Runnable() {
   
//                @Override
//                public void run() {
   
//                    System.out.println("线程名称:"+Thread.currentThread().getName());
//                }
//            });
 //       }
            //方法2
        for (int i = 0; i < 10; i++) {
   
            threadPool.execute(new Runnable() {
   
                @Override
                public void run() {
   
                    System.out.println("线程名称:" + Thread.currentThread().getName());
                }
            });
        }
        }
    }

在这里插入图片描述
submit VS execute:
使用submit它可以执行有返回值的任务或者是无返回值的任务;而execute只能执行不带返回值的任务。
在这里插入图片描述

1.1有返回值的线程池
import java.util.Random;
import java.util.concurrent.*;

/**
 * 演示有返回值的线程池
 */
public class ThreadPoolDemo2 {
   
    public static void main(String[] args) throws ExecutionException, InterruptedException {
   
        ExecutorService threadPool= Executors.newFixedThreadPool(5);
       Future<Integer> result=threadPool.submit(new Callable<Integer>() {
   
           @Override
           public Integer call() throws Exception {
   
               int num=new Random().nextInt(10);//0-9的随机数
               System.out.println("生成的随机数"+num);
               return num;
           }
       });
        System.out.println("得到线程池返回结果:"+result.get());

    }
}

1.2 创建线程工厂:⾃定义线程池名称或优先级
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;

/**
 * 线程工厂示例演示
 */
public class ThreadPoolDemo3 {
   
    public static void main(String[] args) {
   
        //1.创建线程工厂
        ThreadFactory factory=new ThreadFactory() {
   
            @Override
            public Thread newThread(Runnable r) {
   
              //注意:!!!!!一定要把任务Runnable设置给新创建的线程
                Thread thread=new Thread(r);
                //设置线程的命名规则
         thread.setName("我的线程-"+r.hashCode());
          
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值