基础线程机制

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 内核 UFO-非UFO 路径切换内存破坏漏洞的 PoC(CVE-2017-1000112)

    // A proof-of-concept local root exploit for CVE-2017-1000112. // Includes KASLR and SMEP bypasses. ...

  2. Oracle 在约束中使用正则表达式

    ALTER TABLE mytest ADD CONSTRAINT CK_REG CHECK(REGEXP_LIKE(TEST, '^[0-9]{1,3}(\.[0-9]){0,1}$'));

  3. 问题:oracle DECLARE 变量重复利用;结果:Oracle 定义变量总结

    首先,当在cmd里办入scott密码提示错误时,可以这样改一下,scott的解锁命令是: 以system用户登录:cmdsqlplus system/tigertigeralter user scot ...

  4. DAY15-Django模板语言

    Django模板系统 官方文档 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(reque ...

  5. DAY15-web框架本质及第一个Django实例

    Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 impor ...

  6. Tensorflow学习—— AdamOptimizer

    import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data #载入数据集mnist = inpu ...

  7. ruby 变量和方法

    def say_goodnight(name) result ="Good night ." +name return result end def say_goodmorning ...

  8. 校园客户端(DR)启动后提示我们缺失packet.dll,无法正常启动(7)

    有的时候校园客户端(DR)启动后提示我们缺失packet.dll,无法正常启动,然而我们重装了客户端后任然不感冒,那么问题来了,问题解决不了往往源于我们对问题的本质不够了解,如果了解问题的本质,那么问 ...

  9. 1、awk打开多个文件的方法

    转载:http://www.cnblogs.com/Berryxiong/p/6209324.html 1.当awk读取的文件只有两个的时候,比较常用的有三种方法(1)awk 'NR==FNR{... ...

  10. 树莓派研究笔记(6)-- Lakka模拟游戏机

    我发现lakka的支持的游戏平台特别多,包括国产的OrangePI,真是太棒了.我们可以用这个来打造一个全功能模拟器平台.(删除线部分为Orange PI 测试成功内容,但在树莓派上无需那些操作) 访 ...