executor

concurrent.futures模块简单介绍(线程池,进程池)

匿名 (未验证) 提交于 2019-12-02 22:51:30
一、基类Executor Executor类是ThreadPoolExecutor 和ProcessPoolExecutor 的基类。它为我们提供了如下方法: submit(fn, *args, **kwargs):提交任务。以 fn(*args **kwargs) 方式执行并返回 Future 对像。 fn:函数地址。 *args:位置参数。 **kwargs:关键字参数。 map(func, *iterables, timeout=None, chunksize=1): func:函数地址。 iterables:一个可迭代对象,以迭代的方式将参数传递给函数。 timeout:这个参数没弄明白,如果是None等待所有进程结束。 chunksize:使用 ProcessPoolExecutor 时,这个方法会将 iterables 分割任务块,并作为独立的任务提交到执行池中。这些块的数量可以由 chunksize 指定设置。 对很长的迭代器来说,设置chunksize 值比默认值 1 能显著地提高性能。 chunksize 对 ThreadPoolExecutor 没有效果。 shutdown(wait=True):如果为True会等待线程池或进程池执行完成后释放正在使用的资源。如果 wait 为 False,将立即返回,所有待执行的期程完成执行后会释放已分配的资源。 不管

Spring Boot 之异步执行方法

匿名 (未验证) 提交于 2019-12-02 21:52:03
前言: 最近的时候遇到一个需求,就是当服务器接到请求并不需要任务执行完成才返回结果,可以立即返回结果,让任务异步的去执行。开始考虑是直接启一个新的线程去执行任务或者把任务提交到一个线程池去执行,这两种方法都是可以的。但是Spring 这么强大,肯定有什么更简单的方法,就 google 了一下,还真有呢。就是使用 @EnableAsync 和 @Async 这两个注解就 ok 了。 给方法加上 @Async 注解 package me . deweixu . aysncdemo . service ; public interface AsyncService { void asyncMethod ( String arg );} package me . deweixu . aysncdemo . service . ipml ; import me . deweixu . aysncdemo . service . AsyncService ; import org . springframework . scheduling . annotation . Async ; import org . springframework . stereotype . Service ; @Servicepublic class AsyncServiceImpl implements

Netty中的ChannelFuture和ChannelPromise

匿名 (未验证) 提交于 2019-12-02 21:40:30
在Netty使用ChannelFuture和ChannelPromise进行异步操作的处理 这是官方给出的ChannelFutur描述 1 * | Completed successfully | 2 * +---------------------------+ 3 * +----> isDone() = true | 4 * +--------------------------+ | | isSuccess() = true | 5 * | Uncompleted | | +===========================+ 6 * +--------------------------+ | | Completed with failure | 7 * | isDone() = false | | +---------------------------+ 8 * | isSuccess() = false |----+----> isDone() = true | 9 * | isCancelled() = false | | | cause() = non-null | 10 * | cause() = null | | +===========================+ 11 * +--------------------------+ | |

java线程安全之Executor框架及自定义线程池(十五)

☆樱花仙子☆ 提交于 2019-12-02 19:40:55
Executor框架及自定义线程池 Executor框架 概念理解 为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效地进行线程控制。它们都在Java.util.concurrent包中,是JDK并发包的核心。其中有一个比较重要的类:Executors,他扮演这线程工厂的角色,我们通过Executors可以创建特定功能的线程池。Executors创建线程池方法: newFixedThreadPool()方法,该方法返回一个固定数量的线程池,该方法的线程数始终不变,当有一个任务提交时,若线程池中空闲,则立即执行,若没有,则会被暫缓在一个任务队列中等待有空闲的线程去执行· 具体源码如下: public static ExecutorService newFixedThreadPool ( int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, //初始化多少个线程 / 最大线程 0 L, TimeUnit.MILLISECONDS, //这两个参数一起用的等待的时间 这里为 0 new LinkedBlockingQueue<Runnable>()); //无界队列 如果这个任务没有空闲线程就会 缓存到这个线程中 } newSingleThreadExecutor()方法

使用Executor框架创建线程池+自定义线程池+JDK拒绝策略

自古美人都是妖i 提交于 2019-12-02 19:32:39
Executors创建线程池 为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效地进行线程控制。它们都在java.util.concurrent包中,是JDK并发包的核心。其中有一个比较重要的类:Executors,它扮演着线程工厂的角色,我们通过Executors可以创建特定功能的线程池。 Executors创建线程池方法: newFixedThreadPool()方法,该方法返回一个固定数量的线程池,该方法的线程数始终不变,当有一个任务提交时,若线程池中空闲,则立即执行,若没有,则会被暂时缓存在一个任务队列中,等待有空闲的线程去执行。 newSingleThreadExecutor()方法,创建一个线程的线程池,若空闲则执行,若没有空闲线程则暂缓在任务队列中。 newCachedThreadPool()方法,返回一个可以根据实际情况调整线程个数的线程池,不限制最大线程数量。只要有一个任务来了,就创建一个线程去执行任务。若无任务则不创建线程。并且每一个空闲线程会在60秒后自动回收。 newScheduledThreadPool()方法,该方法返回一个ScheduledExecutorService对象。但该线程池可以指定线程的数量,其中的每一个线程可以实现定时器的作用。 无论创建哪种类型的线程池

线程池管理工具类

ε祈祈猫儿з 提交于 2019-12-02 19:25:13
package com.tjy.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.*; public class ExecutorServiceUtil { private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors(); private static Logger logger = LoggerFactory.getLogger("ExecutorServiceUtil"); private static final BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(1000); private static final ExecutorService executor = new ThreadPoolExecutor(CPU_COUNT+1, CPU_COUNT*2+1, 60L, TimeUnit.SECONDS, queue, new RejectedExecutionHandler() { public void rejectedExecution(Runnable

线程池工具类的封装

淺唱寂寞╮ 提交于 2019-12-02 19:23:48
了解更多学习 ThreadPoolExecutor 类 ThreadPool.java package com.tool.me.thread; import java.util.Hashtable; import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPool { private static Map<String, ThreadPoolExecutor> map = new Hashtable<>(); private ThreadPoolExecutor executor; /** * 阻塞任务队列数 */ private int wattingCount; /** * 线程池的名字,e.g:子系统的包名(com.tool.me) */ @SuppressWarnings("unused") private String name; /** * 创建线程池 * * @param name *

java并发编程中常用的工具类 Executor

拟墨画扇 提交于 2019-12-02 19:18:26
/*************************************************** * TODO: description . * @author: gao_chun * @since: 2015-4-17 * @version: 1.0.0 * @remark: 转载请注明出处 **************************************************/ java.util.concurrent.Executor 使用 Executor 的软件包 java.util.concurrent 在并发编程中很常用的工具类。 java.util.concurrent 中 Executor 的使用 java.util.concurrent 中 Executor 的子接口 interface ExecutorService Executor 提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。 interface ScheduledExecutorService 一个 ExecutorService ,可安排在给定的延迟后运行或定期执行的命令。 实现 Executor 的 java.util.concurrent 中的类 class AbstractExecutorService 提供

MyBatis 源码篇-插件模块

廉价感情. 提交于 2019-12-02 18:22:57
本章主要描述 MyBatis 插件模块的原理,从以下两点出发: MyBatis 是如何加载插件配置的? MyBatis 是如何实现用户使用自定义拦截器对 SQL 语句执行过程中的某一点进行拦截的? 示例准备 首先准备两个拦截器示例,代码如下。 @Intercepts({ @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}), @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class})}) public class AInterceptor implements Interceptor { private static final Logger LOGGER = LoggerFactory.getLogger(AInterceptor.class); /** * 执行拦截逻辑的方法 * *

线程创建的四种方式

二次信任 提交于 2019-12-02 18:09:40
java中创建线程的四种方法以及区别 Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用四种方式来创建线程,如下所示: 1)继承Thread类创建线程 2)实现Runnable接口创建线程 3)使用Callable和Future创建线程 4)使用线程池例如用Executor框架 下面让我们分别来看看这四种创建线程的方法。 ------------------------继承Thread类创建线程--------------------- 通过继承Thread类来创建并启动多线程的一般步骤如下 1】d定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体。 2】创建Thread子类的实例,也就是创建了线程对象 3】启动线程,即调用线程的start()方法 代码实例 public class MyThread extends Thread{//继承Thread类   public void run(){   //重写run方法   } } public class Main {   public static void main(String[] args){     new MyThread().start();//创建并启动线程   } } -----------