线程池的简单介绍以及实现一个线程池

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

文章目录

1、线程池存在的意义

线程存在的意义使用进程来实现并发编程造成资源浪费等因此引入了线程使用线程来实现并发编程线程也叫“轻量级进程”因为 创建、销毁、调度线程比创建、销毁、调度进程更高效
但是当我们需要频繁的创建、销毁线程时就会发现开销还是挺大的因此我们引入了线程池

2、什么是线程池

线程池顾名思义就是“存放线程的池子”

3、线程池的使用

事先把线程创建好放到“池”中后面需要使用的时候直接从“池”里获取即可如果线程使用完毕接着放回“池”里面

注意从“池”中取出放入线程比创建销毁线程更高效;因为前者是用户代码实现的后者是操作系统内核完成的


什么是操作系统内核
内核是操作系统的内部核心程序它向外部提供了对计算机设备的核心管理调用。我们将操作系统的代码分成2部分。内核所在的地址空间称作内核空间。而在内核以外的统称为外部管理程序它们大部分是对外围设备的管理和界面操作。外部管理程序与用户进程所占据的地址空间称为外部空间。通常一个程序会跨越两个空间。当执行到内核空间的一段代码时我们称程序处于内核态而当程序执行到外部空间代码时我们称程序处于用户态
概念有点抽象。举个例子

去面馆吃饭你正在吃面的时候突然 想喝冰红茶了你有两种选择第一种自己到冰箱里面拿冰红茶也就是上面说的“用户态”第二种让老板给你拿一瓶冰红茶送到你这里来也就是上面说的“内核态”

相比于内核态来说用户态的程序执行行为是可控的就拿上述的面条例子来说自己直接跑到冰箱拿冰红茶就一定可以很快喝到冰红茶但是如果让老板呢冰红茶送过来什么时候可以喝到冰红茶就是不可预知的了因为老板可能正在忙其他事情等他忙完了才可以去拿冰红茶。因此当使用系统调用执行内核代码的时候无法确定内核都要做哪些工作整体的行为是不可控的


2、java标准库中的线程池

 public static void main(String[] args) {
        ExecutorService pool = Executors.newFixedThreadPool(10);//构造了有10个线程的线程池
        for (int i = 0; i < 100; i++) {
            int n = i;

            //将100个任务放到池子里由池子里的线程来分配任务
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.print(n + " ");
                }
            });
        }
    }

注意1、当前是往线程池里放了100个任务这100个任务又是由10个线程来平均分配的并非严格的平均分配某一个线程多几个任务也是正常的
2、我们会发现main线程结束了但是整个进程还是没结束因为线程池里的线程都是前台线程而前台线程会阻止进程结束
问题一为什么要将i的值保存起来呢
在这里插入图片描述
这里的i是main线程的局部变量即i在主线程的栈上但是随着主线程代码的结束主线程的栈就销毁了如果主线程销毁的时候当前任务的在线程池里还没排到但是此时的i就已经销毁了所以将i的值在当前run的栈上也拷贝了一份即n


3、认识一下不同的线程池

在这里插入图片描述

4、认识一下线程池里的参数

在这里插入图片描述


4、实现一个简单的线程池

class myThreadPool {
    private BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
    public myThreadPool(int k) {//创建线程执行任务
        for(int i = 0;i < k;i++){
            Thread thread = new Thread( () -> {
                while(true){
                    try{
                        Runnable runnable = queue.take();//将任务从队列里拿出
                        runnable.run();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            });
            thread.start();
        }
    }

    public void submit(Runnable runnable) throws InterruptedException {
        queue.put(runnable);//将任务放到队列里面
    }
}
public class Test7 {
    public static void main(String[] args) throws InterruptedException {
        myThreadPool mythreadpool = new myThreadPool(10);//构造有10个线程的线程池

        for (int i = 0; i < 100; i++) {
            int n = i;
            mythreadpool.submit(new Runnable() {   //创建任务
                @Override
                public void run() {
                    System.out.println(n);
                }
            });

        }

    }
}
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6