Java多线程——<三>简单的线程执行:Executor

时间:2023-02-03 21:30:39

一、概述

  按照《Java多线程——<一><二>》中所讲,我们要使用线程,目前都是显示的声明Thread,并调用其start()方法。多线程并行,明显我们需要声明多个线程然后都调用他的start方法,这么一看,似乎有些问题:第一、线程一旦多了,声明势必是个问题;第二、多线程启动如果通过手动执行的话,那可能一个线程已经跑完了,另外一个还没起来(我推测可能会出现这个问题)。所以,我们在想,如果有个管家,能够帮我们管理这么多线程,只需要把我们定义的任务交给管家,管家就能够帮我们把任务附着到线程上,并且当我们给管家发送指令让所有的线程开始并发执行时,他也能够帮助我们开启所有线程执行。

二、java多线程管家——Executor

  Executor允许你管理异步任务的执行,而无须显示地管理线程的生命周期。ExecutorService知道如何构建恰当的上下文来执行Runnable对象。
  1.创建ExecutorService

  通过Executors能够创建两种方式的ExectorService。第一种、CachedThreadPool会为每个传入的任务新创建一个线程

  ExecutorService exec = Executors.newCachedThreadPool();

  第二种、FixedThreadPool可以一次性预先执行代价高昂的线程分配,所以可以用来限制线程的数量。这可以节省时间,因为你不必为每个任务都固定的付出创建线程的开销。

  ExecutorService exeService = Executors.newFixedThreadPool(5);

  2.把任务附着给ExecutorService

  有了executor,你只需要定义任务并将任务对象传递给executor即可。

  exeService.execute(new Task());

  3.让所有任务开始执行

  这两个方法会让之前提交到该exectuor的所有任务开始执行。为了避免启动后,会被注入新的任务,必须在你将所有线程注入后,执行关闭操作以保证这一点。

  exeService.shutdown();

总结:

    |——原来:想执行任务
| | |——1.定义任务
| | |——2.创建任务对象交由Thread对象操纵
| | |——3.显示的调用Thread对象的start()方法
| |——遇到问题:比较繁琐,总得自己启动线程调用;本质上是由main函数调用的
|——现在:使用java.util.concurrent.Executor(执行器)来管理Thread对象
| | |——1.ExecutorService exec = Executors.newAcahedThreadPool();
| | |——2.exec.execute(new Task());
| | |——3.exec.shutdown();
| |——在客户端(显示调用线程执行)和执行任务之间提供了一个间接层,用以执行任务;撇开了main函数,由executor直接进行了调用
| |——允许你管理异步任务的执行,而无须显示地管理线程的生命周期

三、其他

1.何时使用哪种线程池呢?
  CachedThreadPool在程序执行过程中通常会创建与所需数量相同的线程,然后在它回收旧线程时停止创建新线程,因此它是合理的Executor的首选
  只有当这种方式会引起问题时,才需要切换到FixedThreadPool。

2.SingleThreadExecutor

SingleThreadExecutor就像是线程数量为1的FixedThreadPool
|——在另一个线程中连续运行的任何事务来说都很有用(重点是连续运行,因为这样可以顺序接受处理),故SingleThreadPool会序列化所有提交给它的任务,      并会维护它自己隐藏的悬挂任务队列
|——例如:向SingleThreadExecutor提交多个任务,那么这些任务将排队,每个任务都会在下一个任务开始之前运行结束,所有任务使用相同线程。

3.自定义线程工厂

  每个静态的ExecutorService创建方法都被重载为接受一个ThreadFactory对象,该对象将被用来创建新的线程。例如:

public class TaskDaemonFactory implements ThreadFactory{
public Thread newThread(Runnable r){
Thread t = new Thread(r);return t;
}
}

  想使用自己定义的线程工厂

  ExecutorService exec = Executors.newCachedThreadPool(new TaskDaemonFactory());

  这样可以通过具体的要求来改造线程。

注:以上代码均来自《Thinking in java》,内容均来自个人理解与总结,如有理解错误,请大家批评指正

Java多线程——<三>简单的线程执行:Executor的更多相关文章

  1. Java多线程系列四——控制线程执行顺序

    假设有线程1/线程2/线程3,线程3必须在线程1/线程2执行完成之后开始执行,有两种方式可实现 Thread类的join方法:使宿主线程阻塞指定时间或者直到寄生线程执行完毕 CountDownLatc ...

  2. Java多线程之简单的线程同步实例

    数据类: package Thread.MyCommon; public class Data { public int num = 0; public synchronized int getEve ...

  3. Java 多线程&lpar;三)之线程状态及其验证

    目录 线程状态 Thread.State 状态类型 定义 说明 状态转换 状态验证 「NEW」-> 「RUNNABLE」 -> 「TERMINATED」 「RUNNABLE」 -> ...

  4. Java多线程(二) —— 线程安全、线程同步、线程间通信(含面试题集)

    一.线程安全 多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性,就可以称作是线程安全的. 讲到线程安全问题,其实是指多线程环境下对共享资源的访问可能会 ...

  5. Java多线程(一) —— 线程的状态详解

    一.多线程概述  1. 进程 是一个正在执行的程序.是程序在计算机上的一次运行活动. 每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 系统以进程为基本单位进行系统资源的调度 ...

  6. Java多线程(五)线程的生命周期

    点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...

  7. &OpenCurlyDoubleQuote;全栈2019”Java多线程第八章:放弃执行权yield&lpar;&rpar;方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  8. Java多线程-同步&colon;synchronized 和线程通信&colon;生产者消费者模式

    大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同 ...

  9. java 多线程三

    java 多线程一 java 多线程二 java 多线程三 java 多线程四 注意到 java 多线程一 中 MyThread2 运行结果出现0.-1,那是因为在操作共享数据时没有加锁导致. 加锁的 ...

随机推荐

  1. Java:集合for高级循环遍历

    增强for循环: 格式:for(变量数据类型 要遍历的变量 :元素所在数组(集合)名称) 也即 for(Type element: array或collection) 使用foreach遍历集合: 只 ...

  2. 如何判断PHP 是ts还是nts版的

    通过phpinfo(); 查看其中的 Thread Safety 项,这个项目就是查看是否是线程安全,如果是:enabled,一般来说应该是ts版,否则是nts版.

  3. ES6数组去重

    今天五一,在出去玩之前赶紧写篇博客,时刻不要忘记学习^_^!! 提到数组去重,想必大家都不陌生,会的同学可能噼里啪啦写出好几个,下面来看看之前常见的去重代码: 'use strict'; var ar ...

  4. 利用好CSS&comma;实现Qt控件美化

    一.CSS概念 级联样式表 (CSS) 包含应用于网页中的元素的样式规则.CSS 样式定义元素的显示方式以及元素在页中的放置位置.可以创建一个通用规则,只要 Web 浏览器遇到一个元素实例,或遇到一个 ...

  5. mina学习资料整合

    最好的资料当然是官方文档:https://mina.apache.org/mina-project/userguide/user-guide-toc.html 官方文档,配合源码中的example例子 ...

  6. 项目经理的&OpenCurlyDoubleQuote;时间管理法则”(内含10G项目管理书籍)

    项目经理特别是大型项目的项目经理往往琐事缠身,好象每件事情都很重要都需要处理,如何在“百事缠身”的环境下,管理和充分利用好自己的时间,是困扰项目经理的一个大问题.有人会问,为什么我努力善用每分每秒,却 ...

  7. linux查看进程启动的时间点

    ps -ef |grep xxx  # 先查找进程pid ps -wo pid,lstart -p {pid}

  8. shell中&gt&semi;&sol;dev&sol;null 2&gt&semi;&amp&semi;1

    本文转自http://www.kissyu.org/ 背景 我们经常能在shell脚本中发现>/dev/null 2>&1这样的语句.以前的我并没有去深入地理解这段命令的作用,照搬 ...

  9. &lbrack;Python&rsqb;Hamming distance 问题

    In [75]: x=4 In [76]: y=1 In [77]: str(bin(x ^ y))[2:].count('1') Out[77]: 2 In [78]: 来自:https://lee ...

  10. Visual Studio Code 调试 nodejs (断点调试、自动重启、进程调试)

    学习链接: https://cnodejs.org/topic/5a9661ff71327bb413bbff5b https://github.com/nswbmw/node-in-debugging ...