JAVA - 并发编程 - 执行器和线程池

思考?

  1 为什么要使用执行器和线程池?

  2 执行器和线程是什么?怎么使用

执行器

  线程执行器分离了任务的创建和执行,提高了线程的性能

线程池

  避免了频繁地创建和销毁线程,达到线程对象的重用,可以根据项目灵活地控制并发的数量

ExecutorService (java.util.concurrent)

  1 Executors.newCachedThreadPool() 可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程

  2 Executors.newFixedThreadPool() 定长线程池,可控制线程最大并发数,超出的线程会在队列中等待

  3 Executors.newScheduledThreadPool() 定长线程池,支持定时及周期性任务执行

  4 Executors.newSingleThreadExecutor() 单线程的线程池,只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行

执行方法submit和execute的区别

  1 接收的参数不一样 submit参数是Callable, execute参数是Runnable

  2 submit存在返回值,可以知道线程的执行结果,例如:2.1

    2.1 Future<String> future = excutorService.submit(任务)  future.get();//打印线程执行的结果

callable和runable的区别

  callable有返回值,runable没有返回值

    

shutdown和shutdownnow()的区别

  1 shutdown()方法在终止前允许执行以前提交的任务

  2 shutdownnow()方法阻止等待任务启动并试图停止当前正常执行的任务

如何合理配置线程池大小(检查任务的性质,执行时间,以及依赖性)

  1 确定任务的性质 (CPU密集型 ? IO密集型 ? 混合型任务 ? )  

  2 确定任务的执行时间 (长 ? 短 ? 中 ?)

  3 确定任务的依赖性,是否依赖其它的系统资源 (数据连接 ?)

线程池配置方案参考

  1 CPU密集型任务 应配置尽可能少的线程数(上下文切换消耗) CPU个数+1

  2 IO密集型任务 应配置尽可能多的线程数(IO操作不占用CPU) 两倍CPU个数+1

  3 如依赖其它资源,等待时间越长,则CPU空闲时间越长,线程数应设置得越大

  4 线程等待时间所占比例越高,需要越多线程,线程CPU时间所占比例越高,需要越少线程

原文地址:https://www.cnblogs.com/hpzhu/p/9143442.html

时间: 2024-10-10 13:58:34

JAVA - 并发编程 - 执行器和线程池的相关文章

【java并发编程实战】-----线程基本概念

学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习Java并发编程,共同进步,互相指导. 在学习Java并发之前我们需要先理解一些基本的概念:共享.可变.线程安全性.线程同步.原子性.可见性.有序性. 共享和可变 要编写线程安全的代码,其核心在于对共享的和可变的状态进行访问. "共享"就意味着变量可以被多个线程同时访问.我们知道系统中的资

Java并发编程系列(一)-线程的基本使用

最近在学习java并发编程基础.一切从简,以能理解概念为主. 并发编程肯定绕不过线程.这是最基础的. 那么就从在java中,如何使用线程开始. 继承Thread类 继承Thread类,重写run方法,new出对象,调用start方法. 在新启的线程里运行的就是重写的run方法. 1 /** 2 * 集成Thread类 实现run() 3 */ 4 public class C1 extends Thread { 5 6 @Override 7 public void run() { 8 try

Java并发(四)线程池监控

目录 一.线程池监控参数 二.线程池监控类 三.注意事项 在上一篇博文中,我们介绍了线程池的基本原理和使用方法.了解了基本概念之后,我们可以使用 Executors 类创建线程池来执行大量的任务,使用线程池的并发特性提高系统的吞吐量.但是,线程池使用不当也会使服务器资源枯竭,导致异常情况的发生,比如固定线程池的阻塞队列任务数量过多.缓存线程池创建的线程过多导致内存溢出.系统假死等问题.因此,我们需要一种简单的监控方案来监控线程池的使用情况,比如完成任务数量.未完成任务数量.线程大小等信息. 一.

Java 并发:Executors 和线程池

让我们开始来从入门了解一下 Java 的并发编程. 本文主要介绍如何开始创建线程以及管理线程池,在 Java 语言中,一个最简单的线程如下代码所示: Runnable runnable = new Runnable(){ public void run(){ System.out.println("Run"); } } 可通过下面一行代码来启动这个线程: new Thread(runnable).start(); 这是一个再简单不过的例子了,但如果你有许多需要长时间运行的任务同时执行,

Java并发编程(01):线程的创建方式,状态周期管理

本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序,关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在面向线程设计的计算机结构中,进程是线程的容器.程序是指令.数据及其组织形式的描述,进程是程序的实体. 线程 线程是操作系统能够进行运算调度的最小单

Java并发编程(02):线程核心机制,基础概念扩展

本文源码:GitHub·点这里 || GitEE·点这里 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效率.下面提供一个基础的演示案例. 2.应用案例 场景:假设有一个容器集合,需要拿出容器中的每个元素,进行加工处理,一般情况下直接遍历就好,如果数据偏大,可以根据线程数量对集合切割,每个线程处理一部分数据,这样处理时间就会减少很多. public class ExtendThread01 { publ

26、Java并发性和多线程-线程池

以下内容转自http://ifeve.com/thread-pools/: 线程池(Thread Pool)对于限制应用程序中同一时刻运行的线程数很有用.因为每启动一个新线程都会有相应的性能开销,每个线程都需要给栈分配一些内存等等. 我们可以把并发执行的任务传递给一个线程池,来替代为每个并发执行的任务都启动一个新的线程.只要池里有空闲的线程,任务就会分配给一个线程执行.在线程池的内部,任务被插入一个阻塞队列(Blocking Queue ),线程池里的线程会去取这个队列里的任务.当一个新任务插入

Java并发编程笔记4-线程池

我们使用线程的时候就去创建一个线程,但是就会有一个问题: 如果并发的线程数量非常多,而且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会导致大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 线程池正好能解决这样的问题.正如名称所称的那样,线程池管理一个工作者线程的同构池.线程池是与工作队列紧密绑定的.所谓工作队列,其作用是持有所有等待执行的任务. 工作者线程的生活从此轻松起来

Java并发编程-如何终止线程

我们知道使用stop().suspend()等方法在终止与恢复线程有弊端,会造成线程不安全,那么问题来了,应该如何正确终止与恢复线程呢?这里可以使用两种方法: 1.使用interrupt()中断方法. 2.使用volatile boolean变量进行控制. 在使用interrupt方法之前,有必要介绍一下中断以及与interrupt相关的方法.中断可以理解为线程的一个标志位属性,表示一个运行中的线程是否被其他线程进行了中断操作.这里提到了其他线程,所以可以认为中断是线程之间进行通信的一种方式,简