JDK1.5之后,增加了一个Executor让我们能更好的使用多线程。

它位于java.util.concurrent包下

因为是JDK内置类库,我们不需要导入任何第三方jar包。

代码实例:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class Demo {
public static void main(String[] args) {
ExecutorService executorService=Executors.newFixedThreadPool(10); //创建10个线程的线程池
System.out.println("创建线程池后,回收线程池");
executorService.shutdown();
}
}

  Executors类下面有一个静态方法:newFixedThreadPool();表示创建固定数量的线程池。

线程池:内部有多个线程可以调用,系统初始化的时候已经new好,即堆内存开辟的多个线程统一管理。

Executors帮我们管理:进行有效的队列阻塞和调度(底层算法),如果是开发不必深入了解,只需会用就可以了。

以上三行代码最好查阅JDK文档:

public static ExecutorService newFixedThreadPool(int nThreads)方法返回接口ExecutorService

其中有个方法shutdown

此方法可以手工回收,而不必等到GC来回收资源,可以使我们的程序能行更加良好。

对于初学者,代码

ExecutorService executorService=Executors.newFixedThreadPool(10);
是多态,这个必须先明确。

其次查文档最好看Oracle官方给出的英文文档。

使用从父类Executor继承而来的方法execute,

execute()方法接收Runnable类型的参数,于是代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class Demo {
public static void main(String[] args) {
ExecutorService executorService=Executors.newFixedThreadPool(10); //创建10个线程的线程池 executorService.execute(new Runnable() { //匿名内部类 @Override
public void run() {
// TODO Auto-generated method stub }
}); executorService.shutdown();
}
}

  对出初学者,以上用了匿名内部类,这个必须明确。

接口 ExecutorService有一个实现类ThreadPoolExecutor,
其中有一个方法public int getActiveCount()可以返回活动的线程数

public class Demo {
private static Integer page=1; public static void main(String[] args) {
ExecutorService executorService=Executors.newFixedThreadPool(10); //创建10个线程的线程池 while(true){
if(page<=100){
executorService.execute(new Runnable() { //匿名内部类
@Override
public void run() {
System.out.println("抓去了第"+page+"个网页");
page++;
}
});
}else{
//接口 ExecutorService有一个实现类ThreadPoolExecutor,
//其中有一个方法public int getActiveCount()
ThreadPoolExecutor threadPoolExecutor=(ThreadPoolExecutor)executorService; //向下转型(强制)
if(threadPoolExecutor.getActiveCount()==0){ //活动线程数为零
executorService.shutdown();
System.out.println("任务结束");
break; //跳出循环
}
}
//因为太快,我们测试时休眠一下
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }
}

  对于初学者必须明确,ThreadPoolExecutor类型向上转型到ExecutorService接口类型,需要强制转换,

之后我们运行,如下图:

Java内置多线程框架Executor的更多相关文章

  1. Spark2.1.0——内置Web框架详解

    Spark2.1.0——内置Web框架详解 任何系统都需要提供监控功能,否则在运行期间发生一些异常时,我们将会束手无策.也许有人说,可以增加日志来解决这个问题.日志只能解决你的程序逻辑在运行期的监控, ...

  2. 【子非鱼】冒泡排序过程呈现之java内置GUI表示

    自己玩玩写写,排序的过程多么有趣,特别是把看着电脑吧一堆乱七八糟的数据排成有序组合的时候,看起来贼舒服,特别是强迫症患者.好了,话不多说上代码,也算是自己记录一下吧,没有什么技术含量但个人感觉比较有趣 ...

  3. 深入理解Java内置锁和显式锁

    synchronized and Reentrantlock 多线程编程中,当代码需要同步时我们会用到锁.Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两 ...

  4. java内置线程池ThreadPoolExecutor源码学习记录

    背景 公司业务性能优化,使用java自带的Executors.newFixedThreadPool()方法生成线程池.但是其内部定义的LinkedBlockingQueue容量是Integer.MAX ...

  5. Spark2.1.0——内置RPC框架详解

    Spark2.1.0——内置RPC框架详解 在Spark中很多地方都涉及网络通信,比如Spark各个组件间的消息互通.用户文件与Jar包的上传.节点间的Shuffle过程.Block数据的复制与备份等 ...

  6. 【开发者笔记】冒泡排序过程呈现之java内置GUI表示

    自己玩玩写写,排序的过程多么有趣,特别是把看着电脑吧一堆乱七八糟的数据排成有序组合的时候,看起来贼舒服,特别是强迫症患者.好了,话不多说上代码,也算是自己记录一下吧,没有什么技术含量但个人感觉比较有趣 ...

  7. Java并发—线程池框架Executor总结(转载)

    为什么引入Executor线程池框架 new Thread()的缺点 每次new Thread()耗费性能 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞 ...

  8. 为什么阿里Java规约禁止使用Java内置线程池?

    IDEA导入阿里规约插件,当你这样写代码时,插件就会自动监测出来,并给你红线提醒. 告诉你手动创建线程池,效果会更好. 在探秘原因之前我们要先了解一下线程池 ThreadPoolExecutor 都有 ...

  9. Java内置定时器Timer

    Timer是Java内置的一个定时任务,类似于JavaScript里面的setTimeout()和setInterval()方法,可以延迟一定的时间执行任务,也可以按时间间隔重复执行任务. Timer ...

随机推荐

  1. [LeetCode] 834. Sum of Distances in Tree

    LeetCode刷题记录 传送门 Description An undirected, connected treewith N nodes labelled 0...N-1 and N-1 edge ...

  2. 027 (H5*) react01

    目录 正文 1:创建Vue项目 1: 全局安装 vue-cli cnpm install --global vue-cli 2: 创建一个基于 webpack 模板的新项目 vue init webp ...

  3. Python基础-1 python由来 Python安装入门 注释 pyc文件 python变量 获取用户输入 流程控制if while

    1.Python由来 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚 ...

  4. Docker中使用多阶段Dockerfile构建容器镜像image(镜像优化)

    使用多阶段构建 预计阅读时间: 6分钟 多阶段构建是守护程序和客户端上需要Docker 17.05或更高版本的新功能.多阶段构建对于那些努力优化Dockerfiles同时使其易于阅读和维护的人来说非常 ...

  5. Sentinel整合Dubbo限流实战(分布式限流)

    之前我们了解了 Sentinel 集成 SpringBoot实现限流,也探讨了Sentinel的限流基本原理,那么接下去我们来学习一下Sentinel整合Dubbo及 Nacos 实现动态数据源的限流 ...

  6. Java虚拟机最多支持多少个线程?

    作者:miracle1919  来源:http://sina.lt/getP McGovernTheory在StackOverflow提了这样一个问题:Java虚拟机最多支持多少个线程?跟虚拟机开发商 ...

  7. 使用内核LED框架搭建驱动 ——led_classdev_register

    #include <linux/init.h> // __init __exit #include <linux/module.h> // module_init module ...

  8. python 重点理论知识点

    Python多线程 GIL blablabla concurrent blablabla 简单地说就是作为可能是仅有的支持多线程的解释型语言(perl的多线程是残疾,PHP没有多线程),Python的 ...

  9. Python中map和reduce函数??

    ①从参数方面来讲: map()函数: map()包含两个参数,第一个是参数是一个函数,第二个是序列(列表或元组).其中,函数(即map的第一个参数位置的函数)可以接收一个或多个参数. reduce() ...

  10. 垂直口风琴菜单3(jquery)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...