python中ThreadPoolExecutor如何使用 说明 1、ThreadPoolExecutor构造实例时,输入max_workers参数,设定线程池中最多可同时运行的线程数。...2、使用submit函数将需要执行的任务(函数名和参数)提交到线程池中,然后返回任务的句柄. 类似于文件和绘图,注意,submit不是堵塞的,而是立即返回。 实例 # !...usr/bin/env python # -*- coding:utf-8 _*- from concurrent.futures import ThreadPoolExecutor import time... time.sleep(times) print("down video {}s finished".format(times)) return times executor = ThreadPoolExecutor...的使用,希望对大家有所帮助。
ThreadPoolExecutor也就是线程池。它就是Java为我们开发多线程程序时提供的一个开发框架。...它可以统一的管理线程的创建、销毁、优化、监控等,在使用线程池时比我们直接使用原始的线程类更加方便。既然线程池这么方便,那它到底是怎么实现上述的功能呢?...线程池的创建:在创建ThreadPoolExecutor时,会需要传递几个必要的参数,下面我们详细看一下它们每个参数所代表的含义。...时,线程池会重新创建一个新的线程来处理任务,而不是直接使用线程池中的空闲线程。...下面我们用具体的代码来详细说明一下ThreadPoolExecutor的使用。 ? ?
我们上面讲解了 Executor框架以及 ThreadPoolExecutor 类,下面让我们实战一下,来通过写一个 ThreadPoolExecutor 的小 Demo 来回顾上面的内容。...@Override public String toString() { return this.command; } } 编写测试程序,我们这里以阿里巴巴推荐的使用...ThreadPoolExecutor 构造函数自定义参数的方式来创建线程池。...//通过ThreadPoolExecutor构造函数自定义参数创建 ThreadPoolExecutor executor = new ThreadPoolExecutor...在 5.1 节中的 Demo 中我们使用 executor.execute(worker)来提交一个任务到线程池中去,这个方法非常重要,下面我们来看看它的源码: // 存放线程池的运行状态 (runState
序 双向队列(Deque),是Queue的一个子接口,双向队列是指该队列两端的元素既能入队(offer)也能出队(poll)。使用场景比如工作窃取,比如限流。...限流实例 使用deque来限流,其中timeIntervalInMs为事件窗口,maxLimit为该事件窗口的最大值。...private static final Logger LOGGER = LoggerFactory.getLogger(DemoRateLimiter.class); private final Deque...pool.invokeAll(Arrays.asList(test,test,test,test,test)); Thread.sleep(100000); } 小结 这里使用了...Deque的容量来作为时间窗口的限流大小,利用两端来判断时间窗口,相对来讲有点巧妙。
线程池一般的使用方法: 通过 Executors.newFixedThreadPool(...).execute(Runnable()) 并发运行,例如下面的代码片段 1 ExecutorService...线程池和AsyncTask()结合使用: AsyncTask() 知识恶补入口:http://www.2cto.com/kf/201203/122729.html 这里只说下 AsyncTask()的executeOnExecutor...即是我们的线程池实例,默认的可以传入AsyncTask.THREAD_POOL_EXECUTOR,多线程并发,我们上面的是自定义的线程池,默认的最大并发5个,队列最大128个,当然,我们可以new 一个ThreadPoolExecutor...public static int j = 0 ; 20 public final Object myTPLock = new Object();//对象锁,主要用来实现同步,我这里并没有使用
https://cloud.tencent.com/developer/user/1148436/activities 这里主要使用Executors中的4种静态创建线程池实例方法中的 newFixedThreadPool...线程池一般的使用方法: 通过 Executors.newFixedThreadPool(...).execute(Runnable()) 并发运行,例如下面的代码片段 1 ExecutorService...线程池和AsyncTask()结合使用: AsyncTask() 知识恶补入口:http://www.2cto.com/kf/201203/122729.html 这里只说下 AsyncTask()的executeOnExecutor...即是我们的线程池实例,默认的可以传入AsyncTask.THREAD_POOL_EXECUTOR,多线程并发,我们上面的是自定义的线程池,默认的最大并发5个,队列最大128个,当然,我们可以new 一个ThreadPoolExecutor...public static int j = 0 ; 20 public final Object myTPLock = new Object();//对象锁,主要用来实现同步,我这里并没有使用
它是一个ExecutorService,使用线程池中的线程执行提交的任务。通常我们使用Executors框架,定义使用。...二、核心及最大线程池数量 ThreadPoolExecutor 会根据核心及最大线程数设定自动的调整线程池内线程的数量。...如:大容量队列和小容量线程池的使用可以最小化cpu使用,系统资源耗费及线程间上下文切换带来的负担。...ThreadPoolExecutor提供了相应的beforeExecute及afterExecute方法用于在任务执行的前后执行相应的操作,如,调整任务执行的环境,重新初始化ThreadLocals,收集统计信息...如下示例:通过继承ThreadPoolExecutor实现一个可暂停,继续特性的线程池: class PausableThreadPoolExecutor extends ThreadPoolExecutor
workQueue 为 SynchronousQueue 同步队列,这个队列类似于一个接力棒,入队出队必须同时传递,因为CachedThreadPool线程创建无限制,不会有队列等待,所以使用SynchronousQueue...; 适用场景:快速处理大量耗时较短的任务,如Netty的NIO接受请求时,可使用CachedThreadPool。...NANOSECONDS, new DelayedWorkQueue()); } 对于ScheduledThreadPool本文不做描述 二、自定义线程池 以下是自定义线程池,使用了有界队列...; Thread.sleep(3000); //让任务执行慢点 } catch (InterruptedException e) {...总结,通过自定义线程池,我们可以更好的让线程池为我们所用,更加适应我的实际场景。 https://www.jianshu.com/p/f030aa5d7a28
workQueue 为 SynchronousQueue 同步队列,这个队列类似于一个接力棒,入队出队必须同时传递,因为CachedThreadPool线程创建无限制,不会有队列等待,所以使用SynchronousQueue...; 适用场景:快速处理大量耗时较短的任务,如Netty的NIO接受请求时,可使用CachedThreadPool。...Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue()); } 二、自定义线程池 以下是自定义线程池,使用了有界队列...; Thread.sleep(3000); //让任务执行慢点 } catch (InterruptedException e) {...总结,通过自定义线程池,我们可以更好的让线程池为我们所用,更加适应我的实际场景。
所以,如果任务不需要返回结果或抛出异常推荐使用 Runnable 接口,这样代码看起来会更加简洁。...线程池会返回一个 Future 类型的对象,通过这个 Future 对象可以判断任务是否执行成功 ,并且可以通过 Future 的 get()方法来获取返回值,get()方法会阻塞当前线程直到任务完成,而使用...isTerminated 当调用 shutdown() 方法后,并且所有提交的任务完成后返回为 true 二.Callable+ThreadPoolExecutor示例代码 MyCallable.java...static final Long KEEP_ALIVE_TIME = 1L; public static void main(String[] args) { //通过ThreadPoolExecutor...构造函数自定义参数创建 ThreadPoolExecutor executor = new ThreadPoolExecutor( CORE_POOL_SIZE
(两个主要原因) 那么我们应该使用ArrayDeque还是LinkedList呐? 总结 Stack类 Java中Stack类底层是数组实现的线程安全的栈。...(两个主要原因) 1.从性能上来说应该使用Deque代替Stack。 Stack和Vector都是线程安全的,其实多数情况下并不需要做到线程安全,因此没有必要使用Stack。...2、Stack从Vector继承是个历史遗留问题,JDK官方已建议优先使用Deque的实现类来代替Stack。...());//[2,1] 那么我们应该使用ArrayDeque还是LinkedList呐?...经过性能对比,更倾向于使用ArrayDeque来表达Java中的栈功能 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
项目中有一个水平分库读写数据的场景,采用了Spring支持的分库策略AbstractRoutingDataSource,数据源名称采用了ThreadLocal来保存,具体执行读写库操作采用ThreadPoolExecutor...ThreadLocal会为每个线程保存一份成员变量的副本,而ThreadPoolExecutor是一些线程不断执行各种任务(线程复用)。...比如,你让具有3个线程的ThreadPoolExecutor执行13个任务,那么有一个线程会执行5个任务,另外两个线程执行4个任务。
1:必须明白为什么要使用线程池:(这点很重要) a:手上项目所需,因为项目主要的目的是实现多线程的数据推送;需要创建多线程的话,那就要处理好线程安全的问题;因为项目需要,还涉及到排队下载的功能,...线程池主要用来解决线程生命周期开销问题和资源不足问题(这段是摘自网络) 2:如何创建一个线程池: public ThreadPoolExecutor(int corePoolSize,...,一般使用LinkedBlockingQueue和Synchronous。...(默认handle) ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。 ...ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程) ThreadPoolExecutor.CallerRunsPolicy
项目场景: 线程池的地方用的还是挺多的,一般来说用的多的还是execute方法,submit方法还是用的挺少的,一般ThreadPoolExecutor 的 submit 方法通常用于将一个任务提交到线程池中执行...使用 submit 方法可以将任务提交到线程池中,由线程池中的线程来执行任务,从而避免了为每个任务创建线程的开销。同时,线程池可以限制同时执行的任务数量,避免资源被过度占用。...从查看submit的源码来看,其实也是调用了java.util.concurrent.Executor#execute方法,只是换了线程实现而已,又让我想起那句话,之前不懂代码的时候看代码是代码,后面懂代码了...,一边计算一边处理,实现逻辑可以这样,在submit返回的Future对象存储在一个集合里面,在另一边可以批次处理也可以单次处理,批次处理就判断所有的submit执行完之后处理,单次处理就使用队列集合,...总结 习惯了用execute就忘记了submit的正确使用方式,惯性是很恐怖的,还是得多多跑跑单元测试。
在springboot项目中如果需要用到ThreadPoolExecutor线程池的话是非常方便的。比使用java并发包中的Executors都还方便很多。...实际上spring中的线程池ThreadpoolExecutor只是对java并发包中的线程池的封装。这样便于在spring环境中快速使用。通过几个注解即可,降低了对代码的侵入性。...1.ThreadPoolExecutor配置 在本文中,将使用spring提供的ThreadPoolTaskExecutor进行配置。...import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.ThreadPoolExecutor...; return "success"; } 只需要将OrderService注入到OrderController即可使用。
我们上面讲解了 Executor框架以及 ThreadPoolExecutor 类,下面让我们实战一下,来通过写一个 ThreadPoolExecutor 的小 Demo 来回顾上面的内容。...} @Override public String toString() { return this.command; }} 编写测试程序,我们这里以阿里巴巴推荐的使用...ThreadPoolExecutor 构造函数自定义参数的方式来创建线程池。...private static final Long KEEP_ALIVE_TIME = 1L; public static void main(String[] args) { //使用阿里巴巴推荐的创建线程池的方式...//通过ThreadPoolExecutor构造函数自定义参数创建 ThreadPoolExecutor executor = new ThreadPoolExecutor
关于Queue的介绍可以看上一篇文章:Java队列Queue使用详解 Deque有三种用途: 普通队列(一端进另一端出): Queue queue = new LinkedList()或Deque...deque = new LinkedList() 双端队列(两端都可进出) Deque deque = new LinkedList() 堆栈 Deque deque = new LinkedList...() 注意:Java堆栈Stack类已经过时,Java官方推荐使用Deque替代Stack使用。...插入操作的后一种形式是专为使用有容量限制的 Deque 实现设计的;在大多数实现中,插入操作不能失败。...应优先使用此接口而不是遗留 Stack 类。在将双端队列用作堆栈时,元素被推入双端队列的开头并从双端队列开头弹出。
线程池是如何处理的 1、线程池判断核心线程池里的线程是否都在执行任务。...我们看下getTask是如何执行的 ? ? 下面我们看下processWorkerExit是如何工作的 ?...线程池的使用 线程池的创建 我们可以通过ThreadPoolExecutor来创建一个线程池 ? 向线程池提交任务 可以使用两个方法向线程池提交任务,分别为execute()和submit()方法。...优先级不同的任务可以使用优先级队列PriorityBlockingQueue来处理。它可以让优先级高的任务先执行 如果一直有优先级高的任务提交到队列里,那么优先级低的任务可能永远不能执行。...执行时间不同的任务可以交给不同规模的线程池来处理,或者可以使用优先级队列,让执行时间短的任务先执行。
线程复用 我们知道Thread.start执行之后,线程就能再次执行了,那ThreadPoolExecutor是如何做到线程复用的呢?...Runnable runnable = taskQueue.poll();//队列里拿 runnable.run();//同步执行 } }).start();// 异步while执行 下面是ThreadPoolExecutor...线程销毁 我们知道,在创建线程池的时候有超时参数keepAliveTime,那么线程池是如何实现精确的超时销毁呢?
JDK 自动创建线程池的几种方式都封装在Executors工具类中: newFixedThreadPool 使用的构造方式为 new ThreadPoolExecutor(var0, var0, 0L,...那么上面说了使用Executors工具类创建的线程池有隐患,那如何使用才能避免这个隐患呢?如何才是最优雅的方式去使用过线程池吗? 生产环境要怎么去配置自己的线程池才是合理的呢?...2、ThreadPoolExecutor 类 要自定义线程池,需要使用ThreadPoolExecutor类。...如果我们忘记调用shutdown,为了让线程资源被释放,我们还可以使用keepAliveTime 和 allowCoreThreadTimeOut来达到目的!...6.2 正确命名Thread 在使用线程池时,一般会接受 ThreadFactory 对象,来控制如何创建thread。
领取专属 10元无门槛券
手把手带您无忧上云