基础线程机制--Executor线程池框架
基础线程机制
Executor线程池框架
1.引入Executor的原因
(1)new Thread()的缺点
每次new Thread()耗费性能
调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制的创建,之间相互竞争,导致过多的系统资源被占用导致系统瘫痪,不利于定时执行,定期执行,线程中断。
(2)采用线程池的优点
可以重用创建的线程,减少对象的创建,消亡的开销,性能更佳。
可以有效的控制最大并发线程数,提高系统资源的利用率,避免过多的资源竞争,避免堵塞。
提供定时执行,定期执行,单线程,并发控制等功能。
2.Executor的介绍
Executor 在java.util.cocurrent包下,通过该框架来控制线程的启动,执行和关闭,可以简化并发编程的操作。
在Java5之后通过Executor来启动线程比使用Thread的start()方法要好,除了更容易管理,还有关键的一点:有助于避免this逃逸的问题--如果我们在构造器中启动一个线程,因为另一个任务可能会在构造器结束之前执行,此时可能回访问到初始化了一半的对象用Executor在构造器中。
Executor 框架包括:线程池,Executor,Executors,ExcutorService,CompletionService,Futrue,Callable 等。
3.Executors方法介绍
Executors类提供四种线程池,
newFixedThreadPool,newCachedThreadPoll,newSingleThreadExecutor,newScheduledThreadPool。
1.public static ExecutorService newFixedThreadPoll(int nThreads)
创建固定大小的线程池。
2.public static ExecutorSurvice newCachedThreadPoll()
创建一个可以缓存的线程池,调用execute将重用以前构造的线程(如果线程可用),如果线程没有可用的,那么将创建一个线程并添加到池中。终止并从缓存中移除那些已经60秒未使用的线程。
3.public static ExecutorService newSingleThreadExecutor()
创建一个单线程化的Executor。
4.public static ExecutorService newScheduledThreadPool()
创建一个定时及周期性的任务执行的线程池,多数情况下可以来代替Timer类。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoll{
public static void main(String[]args){
ExecutorService executorService=Executors.newFixedThreadPool(5);
for(int i=0;i<10;i++){
executorService.execute(new MyRunnable());
}
executorService.shutdown();
}
}
class MyRunnable implements Runnable{
public void run(){
try {
System.out.println(Thread.currentThread().getName());
} catch (Exception e) {
//TODO: handle exception
}
}
}
4.ExecutorService
ExecutorService是一个接口,ExecutorService继承了Executor接口,定义了一些生命周期方法。ExecutorSerive的生命周期包括三种状态:运行,关闭,终止。创建后就进入了运行的状态,当调用shutdown()方法时,便进入了关闭状态,此时意味着ExecutorService不在接受任务。但是它还在执行已经提交的任务,等到所有的任务都完成时,便达到终止状态。
public interface ExecutorService extends Executor{
void shutdown(); //顺次的关闭ExecutorService,不在接受新的任务,等待所有的认为执行完毕,关闭 ExecutorService。
boolean isshutdown(); //判断线程池是否已经关闭
List<Runnable>shutdownNow(); //阻止等待任务启动,并试图关闭当前正在执行的任务,停止接受新的任 务,返回处于等待的任务列表。
boolean isTerminated(); //如果关闭后所有的任务都完成,返回true
<T>Future<T>submit(Callable<T>task); //提交一个返回值的任务用于执行,返回一个表示任务的未决结果的Futrue,该Future的get方法在成功完成时,将返回该任务的结果。
<T>Future<T>submit(Runnable tast,T result); //提交一个Runnable任务用于执行,并返回一个该任务的Future,该Future的get方法在成功完成时,将会返回给定的结果。
}
5.自定义线程池
用ThreadPoolExecutor类来自定义线程池
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.java.util.concurrent.*;
public class MakeThreadPoll{
public static void main(String[]args){
//创建阻塞队列
BlockingQueue<Runnable>bqueue=new ArrayBlockingQueue<Runnable>(20);
ThreadPoolExecutor pool=new ThreadPoolExecutor(3, 5, 30, TimeUnit.MICROSECONDS, bqueue);
Runnable t1=new MyRunnable();
Runnable t2=new MyRunnable();
Runnable t3=new MyRunnable();
Runnable t4=new MyRunnable();
Runnable t5=new MyRunnable();
Runnable t6=new MyRunnable();
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
pool.execute(t6);
pool.execute(t1);
//关闭线程池
pool.shutdown();
}
}
class MyRunnable implements Runnable{
@Override
public void run(){
System.out.println(Thread.currentThread().getName()+"正在执行");
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace(); //TODO: handle exception
}
}
}
基础线程机制--Executor线程池框架的更多相关文章
- 【Java 并发】Executor框架机制与线程池配置使用
[Java 并发]Executor框架机制与线程池配置使用 一,Executor框架Executor框架便是Java 5中引入的,其内部使用了线程池机制,在java.util.cocurrent 包下 ...
- Java并发(基础知识)—— Executor框架及线程池
在Java并发(基础知识)—— 创建.运行以及停止一个线程中讲解了两种创建线程的方式:直接继承Thread类以及实现Runnable接口并赋给Thread,这两种创建线程的方式在线程比较少的时候是没有 ...
- 线程池框架executor
Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务 ...
- Executor线程池框架
Executor线程池框架 new Thread()的缺点 每次new Thread()耗费性能 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致 ...
- Java并发—线程池框架Executor总结(转载)
为什么引入Executor线程池框架 new Thread()的缺点 每次new Thread()耗费性能 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞 ...
- JDK线程池框架Executor源码阅读
Executor框架 Executor ExecutorService AbstractExecutorService ThreadPoolExecutor ThreadPoolExecutor继承A ...
- 2,Executor线程池
一,Executor框架简介 在Java 5之后,并发编程引入了一堆新的启动.调度和管理线程的API.Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.co ...
- 【JUC】JUC线程池框架综述
一.前言 在分析完了JUC的锁和集合框架后,下面进入JUC线程池框架的分析,下面给出JUC线程池的总体框架,之后再逐一进行分析. 二.JUC线程池框架图 说明:从上图可知,JUC线程池框架中的其他接口 ...
- Executor线程池的简单使用
我们都知道创建一个线程可以继承Thread类或者实现Runnable接口,实际Thread类就是实现了Runnable接口. 到今天才明白后端线程的作用:我们可以开启线程去执行一些比较耗时的操作,类似 ...
随机推荐
- MySQL 数据库 练习题
一.表关系 请创建如下表,并创建相关约束 二.操作表 1.自行创建测试数据 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: 3.查询平均成绩大于60分的同学的学号和平均成绩: 4.查询所有 ...
- 窗体的keypreview属性的作用是什么?(设置快捷键和钩子)
如果把窗体的KeyPreview属性设为True,那么窗体将比其内的控件优先获得键盘事件的激活权.比如窗体Form1和其内的文本框Text1都准备响应KeyPress事件,那么以下代码将首先激活窗体的 ...
- 解决springMVC文件上传报错: The current request is not a multipart request
转自:https://blog.csdn.net/HaHa_Sir/article/details/79131607 解决springMVC文件上传报错: The current request is ...
- ClientDataSet + DataSetProvider + FDQuery 的bug
ClientDataSet + DataSetProvider +FDQuery 有 bug ClientDataSet + DataSetProvider +ADOQuery正常. Client ...
- Shell编程进阶 1.4 shell自定义变量
变量 系统自带变量 echo $PATH $HOME $PWD 自定义变量 # a= # echo $a1 # b= # echo $b2 写与用户交互的脚本 vim .sh #!/bin/bash ...
- ssh整合(dao使用hibernateTemplate)
- 解决ftp无法连接登录linux的办法
1. 首先安装vsftpd 命令:yum -y install vsftpd 之后开启服务:service vsftpd start 2.关闭防火墙 1) 重启后生效 开启: chkconfig ip ...
- Win 7系统优化/设置小工具 (脚本)
Win7系统优化脚本 用了多年win7,用的过程中,发现了一些问题,关于系统基本的优化,和个人的使用习惯设置等等,做成了一个脚本,可以一键设置win7的系统设置,比如更新提醒,关闭防火墙提示,烦人的系 ...
- Tensorflow 优化学习
# coding: utf-8 import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data pr ...
- Verilog 语言 001 --- 入门级 --- 编写一个半加器电路模块
Verilog 语言编写一个 半加器 电路模块 半加器 的电路结构: S = A 异或 B C = A 与 B 1. 程序代码 module h_adder (A, B, SO, CO); input ...