【线程,linux培训视频

/**

  • 创建一个可缓存的线程池,若线程数超过处理所需,

  • 缓存一段时间后会回收,若线程数不够,则新建一个线程

*/

public class ThreadDemo20 {

public static void main(String[] args) {

   ExecutorService threadpool =  Executors.newCachedThreadPool();

   //这里要注意,你有几个任务他就会创建几个线程来执行任务,即便你的电脑是八核,但是还是会创建出5个线程

    // 所以这也是使用这种线程池的风险

    for (int i = 0; i < 5; i++) {

        threadpool.submit(() -> {

            System.out.println("线程名称:"+ Thread.currentThread().getName());

        });

    }

}

}




执行结果  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210324150002260.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3draDE4ODkxODQzMTY1,size_16,color_FFFFFF,t_70)



方式三:创建单个线程数的线程池,但是能够保证执行顺序




代码案例



/**

  • 创建单个线程的线程池,但是能够保证线程的执行顺序

*/

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class ThreadDemo21 {

public static void main(String[] args) {

    ExecutorService threadpool =  Executors.newSingleThreadExecutor();

    //有10个任务,但是只有一个线程执行,并且是按照顺序执行的

    for (int i = 0; i < 10; i++) {

        threadpool.submit(()->{

            System.out.println("线程名称"+Thread.currentThread().getName());

        });

    }

}

}




执行结果  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210324150620447.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3draDE4ODkxODQzMTY1,size_16,color_FFFFFF,t_70)  

**单个线程池的优点**:  

1.避免重复的创建和销毁线程  

2.单个线程池里面也有任务队列,可以用来存储很多的任务



* * *



方式四:创建一个单线程可以执行延迟任务的线程池




代码案例



/**

  • 创建一个单线程可以执行延迟任务的线程池

  • 注意:这里的返回值类型和调用方法和前面的不太一样

*/

public class ThreadDemo22 {

public static void main(String[] args) {

    //创建单个可以延迟任务的线程池

    ScheduledExecutorService threadpool =  Executors.newSingleThreadScheduledExecutor();

    System.out.println("添加任务的时间:"+new Date());

    threadpool.schedule(()->{

        System.out.println("执行任务的时间:"+new Date());

    },5,TimeUnit.SECONDS);

}

}




执行结果  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210324151933713.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3draDE4ODkxODQzMTY1,size_16,color_FFFFFF,t_70)



* * *



方式五:创建多个可以执行延迟任务的线程池




代码案例



/**

  • 创建可以执行多个延迟任务的线程池

  • 注意返回值以及调用方法

*/

public class ThreadDemo23 {

public static void main(String[] args) {

    ScheduledExecutorService threadpool =  Executors.newScheduledThreadPool(5);

    for (int i = 0; i < 6; i++) {

        System.out.println("添加任务的时间"+new Date());

        threadpool.schedule(()->{

            System.out.println("执行任务的时间"+new Date());

        },5,TimeUnit.SECONDS);

    }

}

}




执行结果  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210324153556795.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3draDE4ODkxODQzMTY1,size_16,color_FFFFFF,t_70)



方式六:创建一个抢占式执行的线程池,执行任务的顺序不确定




代码案例



import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

  • 创建一个抢占式执行的线程池

  • 执行任务的顺序不确定

*/

public class ThreadDemo24 {

public static void main(String[] args) {

    //创建线程池

   ExecutorService threadpool =  Executors.newWorkStealingPool();

    for (int i = 0; i < 5; i++) {

        int index = i;

        threadpool.submit(()->{

            System.out.println("任务 "+index+" 正在被线程名称为 "+Thread.currentThread().getName()+"执行");

        });

    }

    //确保任务执行完成

    while (!threadpool.isTerminated()) {

    }

    }

}




执行结果  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210324154649590.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3draDE4ODkxODQzMTY1,size_16,color_FFFFFF,t_70)



方式七:是最原始的一种,也是最重要的一种,使用ThreadPoolExcutors创建线程池,里面至少传五个参数




7.1参数的介绍  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210324161453459.png)



1.corPoolSize 核心线程数,线程池中始终存活的线程数



2.mamaximumPoolSize 线程池所能容纳的最大线程数,当线程池的任务队列满了之后可以创建的最大线程数



3.keepAliveTime 最大线程数可以存活的时间,如果超过该时长,非核心线程就会被回收,也就是当线程中没有任务执行时,最大线程就会销毁一部分,最终保持核心线程数量的线程。



4.指定keepAliveTime参数的时间单位。常用的有:TimeUnit.MILLISECONDS(毫秒)、TimeUnit.SECONDS(秒)、TimeUnit.MINUTES(分)



5.一个阻塞队列,用来存储线程池等待执行的任务,均为线程安全



6.threadFactory:线程工厂。用于指定为线程池创建新线程的方式。



7.handler: 拒绝处理任务时的策略——拒绝策略有五种,如:



*   AbortPolicy:拒绝并抛出异常。

    

*   CallerRunsPolicy:使用当前调用的线程来执行此任务。

    

*   DiscardOldestPolicy:抛弃队列头部(最旧)的一个任务,并执行当前任务。

    

*   DiscardPolicy:忽略并抛弃当前任务。

    

*   程序员自己定义的拒绝策略

    

    ThreadPoolExecutors的执行执行逻辑  

    1.当任务量较少的时候使用线程池提供的核心线程数执行执行

    



2.当任务超过核心线程数的时候,新来的任务就会存储到队列



3.当队列已经存储满的了,那么就会增加线程的数量,一直增加到可以扩展的最大线程数,也就是mamaximumPoolSize



4.当最大线程数已满,任务队列已满,就会执行线程池的拒绝策略(5钟拒绝策略)



![在这里插入图片描述](https://img-blog.csdnimg.cn/20210324173830500.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3draDE4ODkxODQzMTY1,size_16,color_FFFFFF,t_70)



**注意**  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210324162329170.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3draDE4ODkxODQzMTY1,size_16,color_FFFFFF,t_70)



[]( )拒绝策略(ThreadPoolExecutors)

-------------------------------------------------------------------------------------------



JDK(4钟拒绝策略)



*   拒绝执行新来任务,并抛出异常(默认拒绝策略)

    

*   可以使用主线程来执行新任务(main主线程)

    

*   忽略当前任务,但不报错

    

*   忽略旧的任务,也不报错  

    程序员自己定义的拒绝策略

    

    ```

     拒绝策略一 :拒绝执行新来任务,并抛出异常 

    ```



import java.util.concurrent.LinkedBlockingQueue;

import java.util.concurrent.ThreadPoolExecutor;

import java.util.concurrent.TimeUnit;

public class ThreadDemo25 {

public static void main(String[] args) {

    //最大线程数一定要大于等于核心线程数,不然就会报错

    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 5, 100, TimeUnit.SECONDS,

            new LinkedBlockingQueue<>(2), new ThreadPoolExecutor.AbortPolicy());

    for (int i = 0; i < 10; i++) {

        final int index = i;

        threadPoolExecutor.submit(() -> {

            System.out.println("我是任务 "+ index);

        });

    }

}

}




执行结果  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210324164945891.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3draDE4ODkxODQzMTY1,size_16,color_FFFFFF,t_70)



* * *



拒绝策略二:可以使用主线程来执行新任务(main主线程)




代码案例



/**

  • 拒绝策略二:可以使用主线程来执行新任务(main主线程)

*/

import java.util.concurrent.LinkedBlockingQueue;

import java.util.concurrent.ThreadPoolExecutor;

import java.util.concurrent.TimeUnit;

public class ThreadDemo26 {

public static void main(String[] args) {

    //最大线程数一定要大于等于核心线程数,不然就会报错

    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 5, 100, TimeUnit.SECONDS,

            new LinkedBlockingQueue<>(2), new ThreadPoolExecutor.CallerRunsPolicy());

    for (int i = 0; i < 10; i++) {

        final int index = i;

        threadPoolExecutor.submit(() -> {

            System.out.println("我是任务 "+ index+"线程名称:"+Thread.currentThread().getName());

        });

    }

}

}




执行结果  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210324165858419.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3draDE4ODkxODQzMTY1,size_16,color_FFFFFF,t_70)



* * *


## 最后

## 权威指南-第一本Docker书

引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。

总共包含了:简介、安装Docker、Docker入门、使用Docker镜像和仓库、在测试中使用Docker、使用Docker构建服务、使用Fig编配Docke、使用Docker API、获得帮助和对Docker进行改进等9个章节的知识。

![image](https://img-blog.csdnimg.cn/img_convert/dce53b293cbd6179fb9d8ef1390b9b35.png)

![image](https://img-blog.csdnimg.cn/img_convert/bf5edba58e1e6a2a3349810286ba29c0.png)

![image](https://img-blog.csdnimg.cn/img_convert/a87cc58b8e689a0c40eeeb7a692b8cba.png)

![image](https://img-blog.csdnimg.cn/img_convert/82ca41ac2cd8fcd7b1a3176c3c0f87df.png)

关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**

演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。

总共包含了:简介、安装Docker、Docker入门、使用Docker镜像和仓库、在测试中使用Docker、使用Docker构建服务、使用Fig编配Docke、使用Docker API、获得帮助和对Docker进行改进等9个章节的知识。

[外链图片转存中...(img-uy6KGEO7-1630930732332)]

[外链图片转存中...(img-IfYzw0YA-1630930732333)]

[外链图片转存中...(img-PJ4FtkF2-1630930732334)]

[外链图片转存中...(img-au7BFsof-1630930732336)]

关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值