java线程池之newFixedThreadPool定长线程池

newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

线程池的作用:

线程池作用就是限制系统中执行线程的数量。
     根 据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排 队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池 中有等待的工作线程,就可以开始运行了;否则进入等待队列。

为什么要用线程池:

1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。

2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

测试代码

package com.ricoh.rapp.deploymenttool.ui.component;

import java.util.Date;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CountdownLatchTest1 {

    public static void main(String[] args) {
        try {
            System.out.println("主线程" + Thread.currentThread().getName() + "等待子线程执行完成...");
            ExecutorService service = Executors.newFixedThreadPool(3);
            final CountDownLatch latch = new CountDownLatch(3);
            for (int i = 0; i < 8; i++) {
                Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        try {
                            System.out.println("子线程" + Thread.currentThread().getName() + "开始执行" + new Date().getTime());
                            Thread.sleep(50000);
                            System.out.println("子线程" + Thread.currentThread().getName() + "执行完成" + new Date().getTime());
                            latch.countDown(); // 当前线程调用此方法,则计数减一
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                };
                service.execute(runnable);
            }
            /*阻塞第一批次的任务,直到第一批次的每个线程都执行完毕才会执行下面的代码;
             * 第一批次如果有执行玩的会开始第二批次的任务,所以会存在第一二批次任务混合的情况
             * */
            latch.await(); // 阻塞当前线程,直到计时器的值为0
            System.out.println("主线程" + Thread.currentThread().getName() + "开始执行...");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /*
     * console:
     * 主线程main等待子线程执行完成...
    子线程pool-1-thread-2开始执行1558941022561
    子线程pool-1-thread-1开始执行1558941022561
    子线程pool-1-thread-3开始执行1558941022561
    子线程pool-1-thread-3执行完成1558941072565
    子线程pool-1-thread-2执行完成1558941072565
    子线程pool-1-thread-3开始执行1558941072565
    子线程pool-1-thread-1执行完成1558941072565
    子线程pool-1-thread-2开始执行1558941072565
    主线程main开始执行...
    子线程pool-1-thread-1开始执行1558941072565
    子线程pool-1-thread-3执行完成1558941122572
    子线程pool-1-thread-1执行完成1558941122572
    子线程pool-1-thread-1开始执行1558941122572
    子线程pool-1-thread-2执行完成1558941122572
    子线程pool-1-thread-3开始执行1558941122572
    子线程pool-1-thread-3执行完成1558941172580
    子线程pool-1-thread-1执行完成1558941172580*/

}

参考:https://www.cnblogs.com/zhujiabin/p/5404771.html  https://www.cnblogs.com/tstd/p/4987935.html

原文地址:https://www.cnblogs.com/wang-liang-blogs/p/10931286.html

时间: 2024-10-10 07:38:48

java线程池之newFixedThreadPool定长线程池的相关文章

线程池2_定长线程池

package com.chauvet.utils.threadPool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /*** * * 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待. * * 定长线程池的大小最好根据系统资源进行设置. * 如:Runtime.getRuntime().availableProcessors() (java虚拟机可用的

内存池--定长内存池

简介 STL的 __pool_alloc, __mt_alloc,boost的pool系列, ace的ACE_Cached_Allocator均为定长内存池. 说明 内存池,根据存储的元素的长度是否可变,分为变长,与定长两种内存池. 从逻辑上来讲,定长内存池只需存储相同大小的元素,因此无须花费额外的空间(数据结构)来存储元素长度的信息. 以上几种定长内存池都可以较好的处理定长内存频繁分配的问题. STL--pool_alloc pool_alloc,原理是挂了16个链表(_S_free_list

定长内存池之BOOST::pool

内存池可有效降低动态申请内存的次数,减少与内核态的交互,提升系统性能,减少内存碎片,增加内存空间使用率,避免内存泄漏的可能性,这么多的优点,没有理由不在系统中使用该技术. 内存池分类: 1.              不定长内存池.典型的实现有apr_pool.obstack.优点是不需要为不同的数据类型创建不同的内存池,缺点是造成分配出的内存不能回收到池中.这是由于这种方案以session为粒度,以业务处理的层次性为设计基础. 2.             定长内存池.典型的实现有LOKI.B

定长线程池Demo

1 import java.util.concurrent.ExecutorService; 2 import java.util.concurrent.Executors; 3 4 /** 5 * Description: 6 * 7 * @author baozikengutou 8 */ 9 public class Test2 { 10 11 public static void main(String[] args) { 12 13 // 创建固定长度线程池 14 ExecutorSe

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 1 2 3 4 5 6 7 new Thread(new

Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

原文:http://www.cnblogs.com/zhujiabin/p/5404771.html 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stu

Java线程池原理及四种线程池的使用

 一.线程池简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间. 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能. 一个线程池包括以下四个基本组成部分: 1.线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务: 2.工作线程(PoolWorke

JAVA多线程提高六:java5线程并发库的应用_线程池

前面我们对并发有了一定的认识,并且知道如何创建线程,创建线程主要依靠的是Thread 的类来完成的,那么有什么缺陷呢?如何解决? 一.对比new Threadnew Thread的弊端 a. 每次new Thread新建对象性能差. b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom. c. 缺乏更多功能,如定时执行.定期执行.线程中断.相比new Thread,Java提供的四种线程池的好处在于:a. 重用存在的线程,减少对象创建.消亡的开销,性能

java线程池与五种常用线程池策略使用与解析

背景:面试中会要求对5中线程池作分析.所以要熟知线程池的运行细节,如CachedThreadPool会引发oom吗? java线程池与五种常用线程池策略使用与解析 可选择的阻塞队列BlockingQueue详解 首先看一下新任务进入时线程池的执行策略: 如果运行的线程少于corePoolSize,则 Executor始终首选添加新的线程,而不进行排队.(如果当前运行的线程小于corePoolSize,则任务根本不会存入queue中,而是直接运行) 如果运行的线程大于等于 corePoolSize