基础线程机制

Executor线程池框架

1.引入Executor的原因

(1)new Thread()的缺点

​  每次new Thread()耗费性能

​  调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制的创建,之间相互竞争,导致过多的系统资源被占用导致系统瘫痪,不利于定时执行,定期执行,线程中断

(2)采用线程池的优点

​  可以重用创建的线程减少对象的创建,消亡的开销,性能更佳。

​  可以有效的控制最大并发线程数提高系统资源的利用率避免过多的资源竞争,避免堵塞

​  提供定时执行定期执行单线程并发控制等功能。

2.Executor的介绍

​  Executor 在java.util.cocurrent包下,通过该框架来控制线程的启动,执行和关闭,可以简化并发编程的操作。

​  在Java5之后通过Executor来启动线程比使用Thread的start()方法要好,除了更容易管理,还有关键的一点:有助于避免this逃逸的问题--如果我们在构造器中启动一个线程,因为另一个任务可能会在构造器结束之前执行,此时可能回访问到初始化了一半的对象用Executor在构造器中。

​  Executor 框架包括:线程池ExecutorExecutors,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线程池框架的更多相关文章

  1. 【Java 并发】Executor框架机制与线程池配置使用

    [Java 并发]Executor框架机制与线程池配置使用 一,Executor框架Executor框架便是Java 5中引入的,其内部使用了线程池机制,在java.util.cocurrent 包下 ...

  2. Java并发(基础知识)—— Executor框架及线程池

    在Java并发(基础知识)—— 创建.运行以及停止一个线程中讲解了两种创建线程的方式:直接继承Thread类以及实现Runnable接口并赋给Thread,这两种创建线程的方式在线程比较少的时候是没有 ...

  3. 线程池框架executor

    Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务 ...

  4. Executor线程池框架

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

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

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

  6. JDK线程池框架Executor源码阅读

    Executor框架 Executor ExecutorService AbstractExecutorService ThreadPoolExecutor ThreadPoolExecutor继承A ...

  7. 2,Executor线程池

    一,Executor框架简介 在Java 5之后,并发编程引入了一堆新的启动.调度和管理线程的API.Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.co ...

  8. 【JUC】JUC线程池框架综述

    一.前言 在分析完了JUC的锁和集合框架后,下面进入JUC线程池框架的分析,下面给出JUC线程池的总体框架,之后再逐一进行分析. 二.JUC线程池框架图 说明:从上图可知,JUC线程池框架中的其他接口 ...

  9. Executor线程池的简单使用

    我们都知道创建一个线程可以继承Thread类或者实现Runnable接口,实际Thread类就是实现了Runnable接口. 到今天才明白后端线程的作用:我们可以开启线程去执行一些比较耗时的操作,类似 ...

随机推荐

  1. 开发环境入门 linux基础 基本操作命令(部分) 文本结构和基本命令

    文本结构和基本命令 linux系统中系统提示符:$ 表示普通用户 su  root切换用户命令(用户名 root),输入密码,切换到其他用户状态 root 命令提示符:# exit 退出当前用户,返回 ...

  2. 问题:Oracle to_date;结果:oracle常用的时间格式转换

    oracle常用的时间格式转换 1:取得当前日期是本月的第几周 SQL> select to_char(sysdate,'YYYYMMDD W HH24:MI:SS') from dual; T ...

  3. 部署和调优 1.5 vsftp部署和优化-1

    系统自带的ftp服务软件.vsftpd 安装vsftpd yum install -y vsftpd 启动vsftpd /etc/init.d/vsftpd start 如果启动失败,可能是端口被占用 ...

  4. 使用NDK编译 libyuv <转>

    官方源码:http://code.google.com/p/libyuv/简介: libyuv is an open source project that includes YUV scaling ...

  5. JS中,split()用法(将字符串按指定符号分割成数组)

    <!DOCTYPE html> <html> <head> <meta charset="{CHARSET}"> <title ...

  6. python的面向对象编程

    面向对象编程是一种程序的范式,它把程序看成是对不同对象的相互调用,对现实世界建立的一种模型. 面向对象编程的基本思想,类和实例.类用于定义抽象对象,实例根据类的定义被创建出来. 在python当中我们 ...

  7. final 子类禁止重写

    <?php //子类中编写和父类中完全一样的函数,是对父类中的函数进行重写 class BaseClass{ public function test() { echo "BaseCl ...

  8. SQL查询语句 [1]

    一.使用字符串作为条件查询 在 Home/controller/UserController.class.php 下插入 <?php namespace Home\Controller; use ...

  9. 线程池的原理以及实现线程池的类ExecutorService中方法的使用

    1.线程池:线程池就是就像一个容器,而这个容器就是用来存放线程的,且有固定的容量. 如果没有线程池,当需要一个线程来执行任务时就需要创建一个线程,我们设创建线程的时间为t1,执行线程的时间为t2,销毁 ...

  10. 7.qfilesystemmodel rowcount 为什么为0? 一个简单的model类的例子

    任务: 1.新建一个空的mainwindow项目 2.debug下编译得到一个文件夹,应用程序输出这个文件夹中的文件(不显示文件夹中的文件夹) 3.使用QFileSystemModel完成. 本例显示 ...