zoukankan      html  css  js  c++  java
  • Java 中几种常用的线程池

    Java 中几种常用的线程池

    转载 : https://www.cnblogs.com/sachen/p/7401959.html

    原创 2016年04月14日 23:29:01

    概述:

    在java内置API中操作线程所用到的类为Thread。创建线程一般有两种方式,

    • 继承Thread方式

    • 实现Runnable方式,并以runnable作为target创建Thread

    在Android中的耗时任务一般都需要另开线程来执行,常常需要用线程池来管理这些线程,实现控制线程数,重用,控制执行和取消等功能。

    Java线程池

    Java提供了四种线程池

    newCachedThreadPool :

    可缓存线程池,若线程池长度超过处理需要,则回收空线程,否则创建新线程,线程规模可无限大。

    ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
    • 1

    当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

    newFixedThreadPool :

    定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
    • 1

    定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()。

    newScheduledThreadPool :

    定长线程池,支持定时及周期性任务执行,类似Timer。

    ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
    • 1

    使用实例:

    ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
    //表示延迟1秒后每3秒执行一次。
    scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            System.out.println("delay 1 seconds, and excute every 3 seconds");
        }
    }, 1, 3, TimeUnit.SECONDS);
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    newSingleThreadExecutor :

    单线程 的线程池,支持FIFO, LIFO, 优先级策略。

    ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
    • 1

    通过观察源码,其中四种线程的创建都是创建一个ThreadPoolExecutor。其中ThreadPoolExecutor是ExecutorService接口的实现类。

    java.util.concurrent

    此包是java的并发编程包,其下定义了三个Executor接口

    并发类图

    Executor:一个运行新任务的简单接口。 
    ExecutorService:扩展了Executor接口。添加了一些用来管理执行器生命周期和任务生命周期的方法。 
    ScheduledExecutorService:扩展了ExecutorService。支持Future和定期执行任务。

    实现类包括:ScheduledThreadPoolExecutor、ThreadPoolExecutor。 
    java中提供的四种线程池,除了ScheduledThreadPool使用的是ScheduledThreadPoolExecutor,其他均为ThreadPoolExecutor。

    ThreadPoolExecutor

    ThreadPoolExecutor

    public ThreadPoolExecutor(int corePoolSize,
                                  int maximumPoolSize,
                                  long keepAliveTime,
                                  TimeUnit unit,
                                  BlockingQueue<Runnable> workQueue,
                                  ThreadFactory threadFactory,
                                  RejectedExecutionHandler handler) {}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    参数说明 
    corePoolSize :线程池的核心线程数。 
    maximumPoolSize :线程池所能容纳的最大线程数。 
    keepAliveTime :非核心线程闲置时的超时时长。超过该时长,非核心线程就会被回收。 
    unit :keepAliveTime的时间单位。 
    workQueue :线程池中的任务队列。 
    threadFactory:线程工厂,默认值DefaultThreadFactory。 
    handler : 饱和策略,当线程池中的数量大于maximumPoolSize,对拒绝任务的处理策略,默认值ThreadPoolExecutor.AbortPolicy()。

    参考: 
    Java并发教程(Oracle官方资料)

    Trinea:Java(Android)线程池

    Java多线程:ThreadPoolExecutor详解

    并发编程网 - ifeve.com

    线程池ThreadPoolExecutor介绍

    抱怨没有用,只能靠自己
  • 相关阅读:
    centos执行sudo 显示command not found的问题
    linux(centos)-command
    关于linux(centos)下浏览器(chrome)打开界面缓慢的一个可能解决办法
    verilog 基本语法
    Date 类 (java.util.Date)
    Objects 类
    发红包案例(普通红包和随机红包)
    接口作为方法的参数和返回值
    接口作为成员变量类型
    类作为成员变量类型
  • 原文地址:https://www.cnblogs.com/mybatis/p/8692137.html
Copyright © 2011-2022 走看看