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. xmake-vscode插件开发过程记录

    最近打算给xmake写一些IDE和编辑器的集成插件,发现vscode的编辑器插件比较容易上手的,就先研究了下vscode的插件开发流程,并且完成了xmake-vscode插件的开发. 我们先来看几张最 ...

  2. Linux的tail命令查看文件

    小文件一般用cat  查看,但是如果文件内容过多,用cat就不合适了 可以用tail命令 # 默认显示文件最后十行 tail a.txt # 监视文件的尾部内容,默认十行, 可以-n 20显示20行 ...

  3. vue项目 引入js文件

    例如我想将laydate.js引到vue项目中 将用到的js文件放到static文件夹内,在项目的根目录下的index.html内引入 <script src="static/js/l ...

  4. Redis数据类型:Hashes、Geo操作指令

    Redis数据类型:Hashes.Geo操作指令 Hashes常用操作指令 Redis Hashes是一个键值对的映射表,最对能存储2^32-1(约40亿)个键值对. HSET HGET HSET:将 ...

  5. Leveldb--Slice

    http://www.kuqin.com/database/20110919/265041.html Slice非常简单的数据结构,它包括length和一个指向外部字节数组的指针.为什么使用Slice ...

  6. java_第一年_JDBC(5)

    事务概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功: 开始事务:start transaction 提交事务:commit 回滚事务:rollback 事务的四大特 ...

  7. Excel VBA 判断工作表是否为空或被使用过(比如设置过框线)

    IsEmpty 函数 返回 Boolean 值,指出变量是否已经初始化. [语法] IsEmpty(expression) 必要的 expression 参数是一个 Variant,包含一个数值或字符 ...

  8. php使用Socket实现聊天室功能(书中的代码)

    这只是一种技术 <?php $host = "127.0.0.1"; // 指定监听的端口,注意该端口不能与现有应用的端口冲突 $port = '9505'; $null = ...

  9. Storm分布式集群搭建

    一.storm版本 选用storm0.9.6 二.本地模式 用于对storm业务逻辑的调试和测试,可以直接在本地运行. 三.分布式模式 生产环境,需要对应的zookeeper.nimbus.super ...

  10. jquery 在页面上根据ID定位(jQuery锚点跳转及相关操作)

    JQuery下锚点的平滑跳转 对于锚点的平滑跳转,在一般的商业性质的网站上,权衡来说,要谨慎使用. 例如:让页面平滑滚动到一个id为box的元素处,则JQuery代码只要一句话,关键位置 如下: $( ...