基础线程机制--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接口. 到今天才明白后端线程的作用:我们可以开启线程去执行一些比较耗时的操作,类似 ...
随机推荐
- Android 4学习(7):用户界面 - 基础
参考<Professional Android 4 Development> Android UI基本元素 下面这些概念是Android UI设计的基础,深入学习和理解它们是Android ...
- onclick事件没有反应的五种可能情况
转自:https://blog.csdn.net/qujing_1120/article/details/76853039 onclick=”alert()” 事件没有反应的几种情况.第一:<i ...
- oracle 调整输出的列宽、行宽
调整列宽 col 列名 format a20 调整行宽 set linesize 150
- elasticsearch2.x ik插件
先来一个标准分词(standard),配置如下: curl -XPUT localhost:/local -d '{ "settings" : { "analysis&q ...
- Matlab 摄像机标定+畸变校正
博客转载自:http://blog.csdn.net/Loser__Wang/article/details/51811347 本文目的在于记录如何使用MATLAB做摄像机标定,并通过opencv进行 ...
- 浅谈assert()函数的用法
#include<stdio.h> #include<assert.h> char * Strcpy(char *dst,const char *src) { assert(d ...
- C语言关键字:auto、static、register、const、volatile 、extern 总结 <转>
auto 这个这个关键字用于声明变量的生存期为自动,即将不在任何类.结构.枚举.联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量.这个关键字不怎么多写,因为所有的变量默认就是aut ...
- Python--面向对象编程--时钟实例开发
在学习python面向对象编程的时候,心血来潮,决定写一个时钟模型来玩玩,所以就有了现在这个小玩意,不过python这个东西确实是挺好玩的 方法:运用python的tkinter库开发图形化时钟程序 ...
- 解决PendingIntent传递参数为空的问题
PendingIntent pIntent = PendingIntent.getActivity(context, 0, intent, 0); 在接收端,接收的数据一直为null,在google ...
- repo的一些用法
repo的用法注:repo只是google用Python脚本写的调用git的一个脚本,主要是用来下载.管理Android项目的软件仓库.(也就是说,他是用来管理给git管理的一个个仓库的) 1.下载r ...