博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
10.线程池_线程调度
阅读量:7127 次
发布时间:2019-06-28

本文共 4651 字,大约阅读时间需要 15 分钟。

/*线程池*/

/*第四种 获取线程的方法:线程池*/

一个ExecutorService,它使用线程池的可能的某个线程之一执行每个提交的任务,通常使用 Executors 工厂方法配置(ExecutorService service = Executors.newFixedThreadPool(5);)

线程池可以解决两个不同问题:

  1.由于减少了每个任务的开销,它们通常可以在执行大量异步任务时 提供增强的性能,

  2.并且还可以提供绑定和管理资源(包括执行任务集时使用的线程)的方法。每个ThreadPoolExecutor 还维护着一些基本的统计数据,如完成的任务数。

为了便于跨大量上下文使用,此类提供了很多可调整的参数和扩展钩子(hook).但是强烈建议 程序员使用较为方便的Executors 工厂方法

  Executors.newCachedThreadPool() (无界线程池,可以进行自动线程回收)

  Executors.newFixedThreadPool(int) (固定线程池大小)

  Executors.newSingleThreadExecutors (单个后台线程)

它们均为 大多数 使用场景预定了一些默认设置(一般不用修改)。

一、线程池:提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度

二、线程体系结构:

  一、线程池:提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度

*
*   二、线程体系结构:

* java.util.concurrent.Executor:负责线程的使用与调度的根接口

* |--**ExecutorService 子接口:线程池的主要接口

* |--ThreadPoolExecutor 线程池的实现类

* |--ScheduledExecutorSerice 子接口:负责线程的调度

* |--ScheduledThreadPoolExecutor : 继承ThreadPoolExecutor,实现 ScheduledExecutorService

*
* 三、工具类:Executors

* ExecutorService newFixedThreadPool() : 创建固定大小的线程池

* ExecutorService newCachedThreadPool() : 缓存线程池,线程池的数量不固定,可以根据需求自动的更改数量

* ExecutorService newSingleThreadPool() : 创建单个线程池 。线程池中只有一个线程

*

* ScheduleExecutorService new ScheduledThreadPool() : 创建固定大小的线程池,可以延迟或定时执行任务

/*使用线程池的是三个步骤*/

  1.创建 线程池 (根据要求可以创建不同的线程池)

  2.放入任务 (将任务交给线程池中的线程去执行)

  3.关闭线程池 (一般需平缓关闭(等正在执行任务的线程执行完毕后))

 

1 /* 2  * 一、线程池:提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度 3  *  4  * 二、线程体系结构: 5  * java.util.concurrent.Executor:负责线程的使用与调度的根接口 6  *         |--**ExecutorService 子接口:线程池的主要接口 7  *             |--ThreadPoolExecutor  线程池的实现类 8  *             |--ScheduledExecutorSerice 子接口:负责线程的调度 9  *                 |--ScheduledThreadPoolExecutor : 继承ThreadPoolExecutor,实现 ScheduledExecutorService    10  * 11  * 三、工具类:Executors12  * ExecutorService newFixedThreadPool()  :  创建固定大小的线程池13  * ExecutorService newCachedThreadPool()  :  缓存线程池,线程池的数量不固定,可以根据需求自动的更改数量14  * ExecutorService newSingleThreadPool()  :  创建单个线程池  。线程池中只有一个线程15  * 16  * ScheduleExecutorService  new ScheduledThreadPool()  :  创建固定大小的线程池,可以延迟或定时执行任务17  * */18 public class TestThreadPool {19     public static void main(String[] args) throws Exception {20         // 1.创建线程池21         ThreadPoolDemo tpd = new ThreadPoolDemo();22         ExecutorService service = Executors.newFixedThreadPool(5);23 24         // 2。为线程池中的线程分配任务(实现 Callable
接口的任务)25 List
> results = new ArrayList
>();26 //执行多次任务,多次任务的返回值 构成一个 List27 for(int i = 0;i < 10;i++) {28 //通过 submit 方法 将任务放入线程池,交给线程池中的线程去执行29 Future
result = service.submit(new Callable
() {30 @Override31 public Integer call() throws Exception {32 int sum = 0;33 for (int i = 0; i <= 10; i++) {34 sum = sum+ i;35 }36 return sum;37 }38 });39 results.add(result);40 }41 42 43 //3.获取call 返回的 数据44 for(Future
result: results) {45 System.out.println(Thread.currentThread().getName() + " : "+ result.get());46 }47 48 //4.关闭线程池 (平缓的)(不关闭线程池,程序不会结束的)49 service.shutdown();50 51 52 // 2.为线程池中的线程分配任务 (为5个线程分配10个任务)53 /*54 * for(int i = 0;i < 10; i++) { service.submit(tpd); }55 * 56 * //3.关闭 线程池(平缓的) service.shutdown();57 */58 }59 }60 61 class ThreadPoolDemo implements Runnable {62 private int i = 100;63 64 @Override65 public void run() {66 while (i >= 0) {67 System.out68 .println(Thread.currentThread().getName() + " : " + i--);69 }70 }71 }

 

ScheduleExecutorService  new ScheduledThreadPool()  :  创建固定大小的线程池,可以延迟或定时执行任务

1 public class TestScheduledThreadPool { 2     public static void main(String[] args) throws Exception { 3         // 创建 调度线程池 4         ScheduledExecutorService service = Executors.newScheduledThreadPool(5); 5  6         for (int i = 0; i < 10; i++) { 7             // 放入任务 8             ScheduledFuture
result = service.schedule( //schedule() 多了 几个参数,可以指定 延迟等待的时间 及 单位 9 new Callable
() {10 @Override11 public Integer call() throws Exception {12 int sum = 0;13 for (int i = 0; i < 100; i++) {14 sum = sum + i;15 }16 System.out.println(Thread.currentThread().getName() + " : " + sum);17 return sum;18 }19 }, 3, TimeUnit.SECONDS);20 21 // 得到call 的结果22 System.out.println(result.get());23 }24 25 //关闭线程池26 service.shutdown();27 28 }29 }

 

转载于:https://www.cnblogs.com/xuzekun/p/7429266.html

你可能感兴趣的文章
WebSocket系列之JavaScript中数字数据如何转换为二进制数据
查看>>
React16.2的fiber架构详解(3)
查看>>
React造轮子:拖拽排序组件「Dragact」
查看>>
WDTP:利器,在于轻便犀利
查看>>
探索从 MVC 到 MVVM + Flux 架构模式的转变
查看>>
【303天】跃迁之路——程序员高效学习方法论探索系列(实验阶段61-2017.12.05)...
查看>>
开机动画
查看>>
使用 CodeMirror 打造属于自己的在线代码编辑器
查看>>
【275天】每日项目总结系列013(2017.11.07)
查看>>
Thrift RPC使用入门
查看>>
多个cell中展示倒计时,本地和服务器时间差异解决方案
查看>>
面试--网络
查看>>
jest 是如何 mock 掉模块的
查看>>
Typescript:基本类型
查看>>
利用PHP实现常用的数据结构之队列(小白系列文章三)
查看>>
vue-webpack-boilerplate里面各文件解析
查看>>
HttpClient获取Cookie的一次踩坑实录
查看>>
当你只有一个设备的时候,如何做好屏幕适配
查看>>
CentOS6.9下JAVA程序泪崩
查看>>
Gradle复合构建
查看>>