`

Concurrent - 线程池

 
阅读更多

原创转载请注明出处:http://agilestyle.iteye.com/blog/2390819

 

ThreadPoolExecutor底层方法参数:

@param corePoolSize: the number of threads to keep in the pool, even if they are idle, unless {@code allowCoreThreadTimeOut} is set

@param maximumPoolSize: the maximum number of threads to allow in the pool

@param keepAliveTime: when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating.

@param unit: the time unit for the {@code keepAliveTime} argument

@param workQueue: the queue to use for holding tasks before they are executed.  This queue will hold only the {@code Runnable} tasks submitted by the {@code execute} method.

@param threadFactory: the factory to use when the executor creates a new thread

@param handler: the handler to use when execution is blocked because the thread bounds and queue capacities are reached 

 

Reject策略预定义有四种: 

(1)ThreadPoolExecutor.AbortPolicy策略,是默认的策略,处理程序遭到拒绝将抛出运行时 RejectedExecutionException。 

(2)ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃. 

(3)ThreadPoolExecutor.DiscardPolicy策略,不能执行的任务将被丢弃. 

(4)ThreadPoolExecutor.DiscardOldestPolicy策略,如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程).

 

ThreadPoolExecutor执行器的处理流程: 

(1)当线程池大小小于corePoolSize就新建线程,并处理请求. 

(2)当线程池大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去从workQueue中取任务并处理. 

(3)当workQueue放不下新入的任务时,新建线程加入线程池,并处理请求,如果池子大小撑到了maximumPoolSize就用RejectedExecutionHandler来做拒绝处理. 

(4)另外,当线程池的线程数大于corePoolSize的时候,多余的线程会等待keepAliveTime长的时间,如果无请求可处理就自行销毁.

package org.fool.test.thread;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class ThreadPoolExecutorTest {
    public static void main(String[] args) {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 3, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(5), new ThreadFactory() {
            private final AtomicInteger threadNum = new AtomicInteger(0);

            @Override
            public Thread newThread(Runnable r) {
                return new Thread(r, "thread-" + threadNum.getAndIncrement());
            }
        });

        for (int i = 0; i < 8; i++) {
            int index = i;

            executor.execute(() -> {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " invoked task:" + index);
            });
        }
    }
} 

例子中 corePoolSize:1, maximumPoolSize: 3, 有界队列容量是5


查看结果输出,可以看到总共执行8个任务0到7,超过了有界队列的容量5,线程1和线程2就优先处理超过有界队列容量的任务6和任务7

 

Spring Bean Example:

<bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
	<!-- 线程池维护线程的最少数量 -->
	<property name="corePoolSize" value="30"/>
	<!-- 线程池维护线程的最大数量 -->
	<property name="maxPoolSize" value="400"/>
	<!-- 缓存队列 -->
	<property name="queueCapacity" value="100"/>
	<!-- 允许的空闲时间 -->
	<property name="keepAliveSeconds" value="200"/>
	<!-- 对拒绝task的处理策略 -->
	<property name="rejectedExecutionHandler">
		<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/>
	</property>
</bean>

 

  • 大小: 415.2 KB
  • 大小: 96.1 KB
分享到:
评论

相关推荐

    concurrent-1.3.4-sources.jar

    2. **java.util.concurrent** 包:这个包是Java并发库的核心,包含了许多并发和线程池相关的类,如ExecutorService、ThreadPoolExecutor、Future和Callable等。ExecutorService是线程池的接口,通过它可以管理和控制...

    并发-线程池和阻塞队列

    阻塞队列(BlockingQueue)是Java并发包(java.util.concurrent)中的一个重要数据结构,它实现了队列的特性,同时具备线程安全的特性。当队列满时,添加元素的线程会被阻塞,直到队列有空位;当队列为空时,取出...

    论文研究-线程池技术研究与应用.pdf

    - Java提供了几种现成的线程池实现,如java.util.concurrent包中的ThreadPoolExecutor类。 - 使用固定大小的线程池、可扩展的线程池或单一后台线程池等。 - 提供了线程池的配置选项,比如线程池的大小、任务排队...

    atlassian-util-concurrent-0.0.12.jar.zip

    - **线程池管理**:Atlassian Util Concurrent库提供了一种定制化的线程池实现,允许开发者根据具体需求调整线程数量、任务队列策略等,从而有效地管理和控制并发执行的任务。 - **锁和同步机制**:库中包含了各种...

    java.util.concurrent 实现线程池队列

    `java.util.concurrent` 包(简称JUC)是Java提供的一个强大的并发工具包,它提供了丰富的并发组件,如线程池、并发容器、锁和同步机制等,极大地简化了并发编程的复杂性。本篇文章将深入探讨如何使用`java.util....

    backport-util-concurrent-3.1.jar

    2. 丰富的功能:backport-util-concurrent-3.1.jar提供了许多实用的并发工具类,涵盖了多线程编程的各个方面,如任务调度、同步控制、线程池等。 3. 高性能:这个库的实现经过了优化,可以在高并发场景下提供良好的...

    concurrent-all-in-one.pdf

    - `ExecutorService`:扩展Executor接口,提供更丰富的管理和控制功能,如线程池管理。 - `ScheduledExecutorService`:支持定时和周期性任务的ExecutorService。 - `Future`:表示异步计算的结果,可以检查任务...

    多线程简单应用-线程池

    Java中,`java.util.concurrent`包提供了ExecutorService接口,它是线程池的主要接口。常见的实现类有ThreadPoolExecutor,它允许我们自定义线程池的核心参数,如核心线程数、最大线程数、线程存活时间、工作队列...

    backport-util-concurrent-3.1.jar和geronimo-stax-api_1.0_spec-1.0.1.jar

    它提供了与Java 5及更高版本相同的并发工具类,如线程池、Future、CyclicBarrier等。这些工具可以提高多线程应用程序的性能和可维护性,尤其是在处理大量并发任务时。如果Eclipse Axis2 Codegen插件在旧版本的JDK上...

    backport-util-concurrent(2.2 /3.1)

    - 对于定时任务的执行,backport-util-concurrent提供了ScheduledThreadPool,这是一个可调度的线程池,能够在指定延迟后执行任务,或者定期执行周期性任务,虽然功能相比Java 5的ScheduledExecutorService有所简化...

    aduna-commons-concurrent-2.6.0.jar.zip

    这个库可能提供了一组高级并发工具,包括线程池、同步机制、原子变量和其他并发控制结构,帮助开发者更安全、更高效地编写多线程程序。使用这样的库可以简化并发编程的复杂性,减少死锁、竞态条件和其他并发问题的...

    aduna-commons-concurrent-2.2.jar.zip

    1. **线程池**:Aduna Commons Concurrent库中的线程池组件,允许开发者灵活地管理并发任务,通过预先创建一组可重用的工作线程来避免频繁的线程创建和销毁开销。线程池可以配置不同的工作策略,如固定大小、动态...

    concurrent-1.3.4.jar

    线程池:concurrent包提供了Executor框架,可以方便地创建和管理线程池,从而更好地控制并发线程的数量,避免线程创建和销毁的开销。 同步工具类:concurrent包提供了一些同步工具类,如CountDownLatch、...

    ant-learn-python-concurrent-main.zip

    5. **并发策略**:根据任务类型选择合适的并发策略,如使用线程池(ThreadPoolExecutor)处理大量短期任务,使用进程池(ProcessPoolExecutor)处理计算密集型任务,或者使用asyncio进行异步I/O操作。 6. **并发与...

    concurrent-1.3.2 connector.

    6. **线程池**:如Java的`ExecutorService`,它可以管理和复用线程,避免频繁创建和销毁线程的开销,提高系统效率。 在"concurrent-1.3.2 connector"这个特定版本中,开发者可能对上述技术进行了优化,以提升连接器...

    aduna-commons-concurrent-2.5.0.jar.zip

    1. **线程池**:Aduna Commons Concurrent提供了一种更加灵活的线程池实现,允许开发者根据具体需求定制线程池的大小、工作队列和拒绝策略。这对于管理大量并发任务和优化系统资源的使用非常有帮助。 2. **锁和同步...

    PyPI 官网下载 | twitter.common.concurrent-0.3.1.tar.gz

    2. **线程池**:管理一组工作线程,以便高效地处理并发任务,避免频繁创建和销毁线程的开销。 3. **锁和信号量**:提供线程安全的数据结构,如互斥锁(Mutex)、读写锁(RLock)、信号量(Semaphore),确保多线程...

    concurrent-patterns-best-practices-synchronization

    例如,在一个线程池中限制同时运行的任务数量。 - **读写锁(Read-Write Lock)**:允许多个读操作同时进行,但写操作必须独占资源。这种机制可以显著提高系统吞吐量。 ##### 设计模式 - **生产者消费者模式**:该...

    java.util.concurrent-多线程框架.docx

    在 java.util.concurrent 多线程框架中,线程池是最重要的一部分。线程池是一种池化技术,用于管理线程的生命周期,包括线程的创建、执行、销毁等。线程池可以大大提高系统的性能和可靠性。 在 Java 语言中,线程池...

Global site tag (gtag.js) - Google Analytics