Java内置多线程框架Executor
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的更多相关文章
- Spark2.1.0——内置Web框架详解
Spark2.1.0——内置Web框架详解 任何系统都需要提供监控功能,否则在运行期间发生一些异常时,我们将会束手无策.也许有人说,可以增加日志来解决这个问题.日志只能解决你的程序逻辑在运行期的监控, ...
- 【子非鱼】冒泡排序过程呈现之java内置GUI表示
自己玩玩写写,排序的过程多么有趣,特别是把看着电脑吧一堆乱七八糟的数据排成有序组合的时候,看起来贼舒服,特别是强迫症患者.好了,话不多说上代码,也算是自己记录一下吧,没有什么技术含量但个人感觉比较有趣 ...
- 深入理解Java内置锁和显式锁
synchronized and Reentrantlock 多线程编程中,当代码需要同步时我们会用到锁.Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两 ...
- java内置线程池ThreadPoolExecutor源码学习记录
背景 公司业务性能优化,使用java自带的Executors.newFixedThreadPool()方法生成线程池.但是其内部定义的LinkedBlockingQueue容量是Integer.MAX ...
- Spark2.1.0——内置RPC框架详解
Spark2.1.0——内置RPC框架详解 在Spark中很多地方都涉及网络通信,比如Spark各个组件间的消息互通.用户文件与Jar包的上传.节点间的Shuffle过程.Block数据的复制与备份等 ...
- 【开发者笔记】冒泡排序过程呈现之java内置GUI表示
自己玩玩写写,排序的过程多么有趣,特别是把看着电脑吧一堆乱七八糟的数据排成有序组合的时候,看起来贼舒服,特别是强迫症患者.好了,话不多说上代码,也算是自己记录一下吧,没有什么技术含量但个人感觉比较有趣 ...
- Java并发—线程池框架Executor总结(转载)
为什么引入Executor线程池框架 new Thread()的缺点 每次new Thread()耗费性能 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞 ...
- 为什么阿里Java规约禁止使用Java内置线程池?
IDEA导入阿里规约插件,当你这样写代码时,插件就会自动监测出来,并给你红线提醒. 告诉你手动创建线程池,效果会更好. 在探秘原因之前我们要先了解一下线程池 ThreadPoolExecutor 都有 ...
- Java内置定时器Timer
Timer是Java内置的一个定时任务,类似于JavaScript里面的setTimeout()和setInterval()方法,可以延迟一定的时间执行任务,也可以按时间间隔重复执行任务. Timer ...
随机推荐
- python基础-10 程序目录结构 学生选课系统面向对象练习
一 程序目录结构 1 bin文件夹 二进制文件.代码程序 2 conf 配置文件 3 帮助文档 4 头文件库文件等 二 学生选课系统部分代码 未完待续 1 包内的__init__.py文件 在包 ...
- Hibernate入门4
HIbernate的导航查询: 适用场景:当一张A表关联到另一张B表的多条记录,存在一对多的关系(或者多对多),那么查询A表的记录时,就可以将A表某条记录关联的B表的所有记录查询出来,这种方式,就叫做 ...
- CDH平台搭建遇到的问题
安装之前遇到的问题: Note: Forwarding request to 'systemctl disable NetworkManager.service'. Removed symlink ...
- [Web 前端] 020 css 定位之绑定定位
绑定定位 少废话,上例子 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 创建Maven项目时,出现系列的错误提示的修改方法
1.创建Maven项目成功之后,需要修改一些配置, (1).java版本改为“本系统中java的版本号” 问题一:(2).Dynamic Web Module的version要改为2.5以上,然而本人 ...
- mysql压缩包安装相关过程命令
mysqld --remove mysql57 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL目 ...
- 针对【H-2017年信息基础班(周一班)】某些同学恶意使用lyl洛谷的谴责
我在此发表针对 2019-04-01 17:38 某些hsy班同学恶意使用lyl账号的强烈谴责,望自重!! 以下为证据: 传送门
- HTMLTestRunner_PY3脚本代码
HTMLTestRunner_PY3.py文件代码如下: # -*- coding: utf-8 -*- """ A TestRunner for use with th ...
- python学习第四十九天XML模块的用法
xml是实现不通语言或程序之间进行数据交换的协议,跟json差不多,但是json用起来简单,还没诞生json,以前都是用xml,下面讲述XML模块的用法. 1,导入xml模块 import xml 2 ...
- IDEA错误: 找不到或无法加载主类 com.xxx.freight.dofreight.doFreight解决办法
1.右键点击工程,选择open Module Settings或点击File选择Project Structure,进入页面 2.选择Artifacts->JAR->From module ...