3.2 线程复用:线程池

参数说明:public ThreadPoolExecutor(int corePoolSize,                          int maximumPoolSize,                          long keepAliveTime,                          TimeUnit unit,                          BlockingQueue<Runnable> workQueue) {    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,         Executors.defaultThreadFactory(), defaultHandler);}

corePoolSize:指定了线程池中的数量。

maximumPoolSize:线程池中的最大线程数量。

keepAliveTime:当线程池超过corePoolSize数量的时候,多余的空闲线程的存活时间。即空闲线程在多长时间后销毁。

unit:时间单位。

workQueue:任务队列,被提交但尚未被执行的任务。

ThreadFactory:线程工厂,一般用改默认即可。
Handler:拒绝策略,当任务太多来不及处理,如何拒绝任务。

4种并发包下提供的线程池
1.ExecutorService executorService = Executors.newSingleThreadExecutor();
public static ExecutorService newSingleThreadExecutor() {    return new FinalizableDelegatedExecutorService        (new ThreadPoolExecutor(1, 1,                                0L, TimeUnit.MILLISECONDS,                                new LinkedBlockingQueue<Runnable>()));}

2.ExecutorService executorService2 = Executors.newCachedThreadPool();
public static ExecutorService newCachedThreadPool() {    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,                                  60L, TimeUnit.SECONDS,                                  new SynchronousQueue<Runnable>());}
3.ScheduledThreadPoolExecutor executorService3 = (ScheduledThreadPoolExecutor) Executors.newFixedThreadPool(1);
public static ExecutorService newFixedThreadPool(int nThreads) {    return new ThreadPoolExecutor(nThreads, nThreads,                                  0L, TimeUnit.MILLISECONDS,                                  new LinkedBlockingQueue<Runnable>());}
4.ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1); 定时运行
public ScheduledThreadPoolExecutor(int corePoolSize) {    super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,          new DelayedWorkQueue());}
scheduleWithFixedDelay: 比如当前一个任务结束的时刻,开始结算间隔时间,如0秒开始执行第一次任务,任务耗时5秒,任务间隔时间3秒,那么第二次任务执行的时间是在第8秒开始。
scheduleAtFixedRate:没有什么歧义,很容易理解,就是每隔多少时间,固定执行任务。
scheduledExecutorService.scheduleAtFixedRate(new ThreadTest(), 1, 2, TimeUnit.SECONDS);
scheduledExecutorService.scheduleWithFixedDelay(new ThreadTest(), 1, 2, TimeUnit.SECONDS);

自定义线程池以及拒绝策略:

package 第三章.线程池;

import java.util.concurrent.*;

/** * Created by zzq on 2018/2/5. */public class 自定义线程池 {    public static void main(String[] args) {        ThreadPoolExecutor threadPoolExecutor=new ThreadPoolExecutor(2,                5,                0,                TimeUnit.SECONDS,                new ArrayBlockingQueue<Runnable>(2),                Executors.defaultThreadFactory(),//                new ThreadPoolExecutor.AbortPolicy());//第一种拒绝策略:直接抛出异常AbortPolicy//                new ThreadPoolExecutor.CallerRunsPolicy());//第二种拒绝策略:新建一个线程//                new ThreadPoolExecutor.DiscardOldestPolicy());//第三种拒绝策略:在队列里推出一个最早的//                new ThreadPoolExecutor.DiscardPolicy());//第四种:直接丢弃。                new RejectedExecutionHandler() {                    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {                        System.out.println(Thread.currentThread().getName()+"被抛弃了");                        try {                            Thread.sleep(2000);                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                        System.out.println(Thread.currentThread().getName()+"拒绝成功");

}                });//自定义拒绝策略        for (int i = 0; i < 10; i++) {            final int finalI = i;            threadPoolExecutor.execute(new Runnable() {                public void run() {                    System.out.println(Thread.currentThread().getName()+"开始"+ finalI);                    try {                        Thread.sleep(10000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    System.out.println(Thread.currentThread().getName()+"结束"+ finalI);                }            });        }

}

}
 
自定义线程创建:

package 第三章.线程池;

import java.util.concurrent.*;

/** * Created by zzq on 2018/2/5. */public class 自定义线程创建 {    public static void main(String[] args) {        ThreadPoolExecutor threadPoolExecutor=new ThreadPoolExecutor(2,                5,                0,                TimeUnit.SECONDS,                new ArrayBlockingQueue<Runnable>(2),                new ThreadFactory() {                    public Thread newThread(Runnable r) {                        Thread t=new Thread(r);                        System.out.println("Creat");                        return t;                    }                },//                new ThreadPoolExecutor.AbortPolicy());//第一种拒绝策略:直接抛出异常AbortPolicy                new ThreadPoolExecutor.CallerRunsPolicy());//第二种拒绝策略:新建一个线程//                new ThreadPoolExecutor.DiscardOldestPolicy());//第三种拒绝策略:在队列里推出一个最早的//                new ThreadPoolExecutor.DiscardPolicy());//第四种:直接丢弃。//                new RejectedExecutionHandler() {//                    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {//                        System.out.println(Thread.currentThread().getName() + "被抛弃了");//                        try {//                            Thread.sleep(2000);//                        } catch (InterruptedException e) {//                            e.printStackTrace();//                        }//                        System.out.println(Thread.currentThread().getName() + "拒绝成功");////                    }//                });//自定义拒绝策略。        for (int i = 0; i < 10; i++) {            final int finalI = i;            threadPoolExecutor.execute(new Runnable() {                public void run() {                    System.out.println(Thread.currentThread().getName()+"开始"+ finalI);                    try {                        Thread.sleep(10000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    System.out.println(Thread.currentThread().getName()+"结束"+ finalI);                }            });        }    }}


原文地址:https://www.cnblogs.com/anxbb/p/8425672.html

时间: 2024-10-13 04:42:27

3.2 线程复用:线程池的相关文章

线程复用:线程池

一.核心线程池内部实现 为了能够更好地控制多线程,JDK提供了一套Executor框架,帮助开发人员有效地进行线程控制,其本质就是一个线程池.它的核心成员如图 以上成员均在java.util.concurrent包中,是JDK并发包的核心类.其中ThreadPoolExecutor表示一个线程池.Executors类则扮演着线程池工厂的角色,通过Executors可以取得一个拥有特定功能的线程池. Executor框架提供了各种类型的线程池,主要有以下工厂方法: public static Ex

线程的复用:线程池(读书笔记)

多线程的软件设计方法确实可以最大限度的发挥现代多核心处理器的计算能力,提高生产系统的吞吐量和性能,但是若不加控制和管理的随意使用线程,对熊的性能反而产生了不力的影响. 在实际生产环境中,线程的数量必须得到控制,盲目的大量创建线程对系统性能是有伤害的. 什么是线程池: 为了避免系统频繁的创建和销毁线程,我们可以让创建的线程进行复用,大家对数据库连接池肯定不陌生,线程池也是一个目的,线程池中,总有那么几条活跃的线程,当你需要线程的时候,可以从池子中随便哪一个空闲线程,当完成工作时,并不着急关闭线程,

java 线程、线程池基本应用示例代码回顾

package org.rui.thread; /** * 定义任务 * * @author lenovo * */ public class LiftOff implements Runnable { protected int countDown=10; private static int taskCount=0; private final int id=taskCount++; public LiftOff(){} public LiftOff(int countDown) { thi

线程与线程池,实例比较。

线程池: int count = 200000; long startTime = System.currentTimeMillis(); final List<Integer> l = new LinkedList<Integer>(); ThreadPoolExecutor tp = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(count))

java 线程、线程池基本应用演示样例代码回想

package org.rui.thread; /** * 定义任务 * * @author lenovo * */ public class LiftOff implements Runnable { protected int countDown=10; private static int taskCount=0; private final int id=taskCount++; public LiftOff(){} public LiftOff(int countDown) { thi

InheritableThreadLocal线程复用

引自:http://www.cnblogs.com/sweetchildomine/p/6575666.html 虽然使用AOP可以获取方法签名,但是如果要获取方法中计算得出的数据,那么就得使用ThreadLocal,如果还涉及父线程,那么可以选择InheritableThreadLocal. 注意:理解一些原理能够减少很多不可控问题,最简单的使用方式就是不要交给线程池处理.为了提高一点性能,而导致数据错误得不偿失. 2018年4月12日 12:44:41更新 关于InheritableThre

InnoDB 存储引擎的线程与内存池

InnoDB 存储引擎的线程与内存池 InnoDB体系结构如下: 后台线程: 1.后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据: 2.另外,将以修改的数据文件刷新到磁盘文件: 3.同时,保证在数据库发生异常的情况下,InnoDB能恢复到正常运行状态. 内存池:InnoDB有多个内存块,这些内存块组成了一个大的内存池.这些内存块包括有:缓冲池(innodb_buffer_pool)和日志缓冲(log_buffer)以及额外内存池(innodb_addtional

线程和线程池

首先线程有守护线程和用户线程两种,区别就是用户线程是否保持程序的运行状态.当程序在运行时,必定有一个或以上的线程是用户线程,而当程序结束时,所有守护线程也都将被关闭.使用Thread.setDaemon(ture)可以把线程标记为守护线程,默认线程状态继承自创建它的线程.线程的两种创建方法不多说了. 线程安全一般指的是共享变量被多个线程访问读写造成的数据不一致或者是数据不完整性.一般有如下几种方法可供参考: 1.synchronized方法,提供只能供一个线程访问的类,方法或语句块,控制变量的修

Android的线程和线程池

原文链接,转载请注明出处 http://sparkyuan.me/2016/03/25/Android的线程和线程池/ 在Java中默认情况下一个进程只有一个线程,也就是主线程,其他线程都是子线程,也叫工作线程.Android中的主线程主要处理和界面相关的事情,而子线程则往往用于执行耗时操作.线程的创建和销毁的开销较大,所以如果一个进程要频繁地创建和销毁线程的话,都会采用线程池的方式. Android中线程的形态 传统的Thread AsyncTask HandlerThread IntentS

线程系列04,传递数据给线程,线程命名,线程异常处理,线程池

本篇体验:如何传递数据给线程,如何给线程命名,线程的异常处理,线程池.实在是太基础的部分. □ 传递数据给线程 ※ 使用Lambda表达式 class Program { static void Main(string[] args) { Thread t = new Thread(() => Say("hello", "world")); t.Start(); } static void Say(string msg, string msg1) { Cons