多线程篇六:线程池

1.固定大小的线程池
ExecutorService threadPools1=Executors.newFixedThreadPool(3);

for(int i=1;i<=10;i++){
final int task=i;
//循环10次,一共往线程池里面放10个任务
threadPools1.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" loop of "+task);
}
});
}
System.out.println("The task is executd completed.....");

// 1.使用固定线程池threadPools1:
// 输出结果: 10任务每次同时有3个线程进行处理,每个线程处理一个。直到处理完10个任务
The task is executd completed.....
pool-1-thread-2 loop of 2
pool-1-thread-1 loop of 1
pool-1-thread-3 loop of 3
pool-1-thread-1 loop of 4
pool-1-thread-2 loop of 5
pool-1-thread-3 loop of 6
pool-1-thread-1 loop of 7
pool-1-thread-3 loop of 9
pool-1-thread-2 loop of 8
pool-1-thread-1 loop of 10

2.缓存线程池(池内没有固定的线程数,根据任务的多少而创建多少个线程)
ExecutorService threadPools2=Executors.newCachedThreadPool();

for(int i=1;i<=10;i++){
            final int task=i;
            //循环10次,一共往线程池里面放10个任务
            threadPools2.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName()+" loop of "+task);
                }
            });
        }
        System.out.println("The task is executd completed.....");

       /*
        * 2.使用缓存线程池threadPools2:
        * 输出结果:(线程池内直接创建10个线程,分别处理10个任务 )
        The task is executd completed.....
        pool-2-thread-10 loop of 10
        pool-2-thread-9 loop of 9
        pool-2-thread-8 loop of 8
        pool-2-thread-7 loop of 7
        pool-2-thread-6 loop of 6
        pool-2-thread-5 loop of 5
        pool-2-thread-4 loop of 4
        pool-2-thread-3 loop of 3
        pool-2-thread-1 loop of 1
        pool-2-thread-2 loop of 2
        */

3.单线程的线程池(池内固定有一个线程,当前线程死后会自动再创建一个,始终维持1一个线程)--比如实现案例:如何实现线程死后重新启动
ExecutorService threadPools3=Executors.newSingleThreadExecutor();

for(int i=1;i<=10;i++){
            final int task=i;
            //循环10次,一共往线程池里面放10个任务
            threadPools3.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName()+" loop of "+task);
                }
            });
        }
        System.out.println("The task is executd completed.....");

       /*
        * 3.使用单一线程池 threadPools3
        * 输出结果:(由单一线程逐一处理10个任务 )
        The task is executd completed.....
        pool-3-thread-1 loop of 1
        pool-3-thread-1 loop of 2
        pool-3-thread-1 loop of 3
        pool-3-thread-1 loop of 4
        pool-3-thread-1 loop of 5
        pool-3-thread-1 loop of 6
        pool-3-thread-1 loop of 7
        pool-3-thread-1 loop of 8
        pool-3-thread-1 loop of 9
        pool-3-thread-1 loop of 10
        */

4.关闭线程池

//等池内的任务执行完,销毁掉线程池.
threadPools3.shutdown();

//立即销毁掉线程池.不会等待任务是否完成
threadPools3.shutdownNow();

5.调度线程池(定时器的线程池)

ScheduledExecutorService scheduleThreadPools=Executors.newScheduledThreadPool(3);

//10s之后执行
scheduleThreadPools.schedule(new Runnable() {
@Override
public void run() {
System.out.println("bombing!");
}
}, 10, TimeUnit.SECONDS);

//固定频率的执行 10s之后执行,每个2S执行一次
scheduleThreadPools.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("bombing!");
}
}, 10, 2,TimeUnit.SECONDS);
时间: 2024-07-30 20:29:01

多线程篇六:线程池的相关文章

Android多线程编程之线程池学习篇(一)

Android多线程编程之线程池学习篇(一) 一.前言 Android应用开发中多线程编程应用比较广泛,而应用比较多的是ThreadPoolExecutor,AsyncTask,IntentService,HandlerThread,AsyncTaskLoader等,为了更详细的分析每一种实现方式,将单独成篇分析.后续篇章中可能涉及到线程池的知识,特此本篇分析为何使用线程池,如何使用线程池以及线程池的使用原理. 二.Thread Pool基础 进程代表一个运行中的程序,一个运行中的Android

Java并发基础(六) - 线程池

Java并发基础(六) - 线程池 1. 概述 这里讲一下Java并发编程的线程池的原理及其实现 2. 线程池的基本用法 2.1 线程池的处理流程图 该图来自<Java并发编程的艺术>: 从图中我们可以看出当一个新任务到线程池时,线程池的处理流程如下: 线程池首先判断线程池里面线程数是否达到核心线程数.如果不是则直接创建新线程作为核心线程来执行该任务(该线程作为核心线程不会由于任务的完成而销毁),否则进入下一流程. 判断阻塞队列是否已经满了.如果没满则将该任务放入阻塞队列中,等待核心线程处理,

多线程系列(2)线程池ThreadPool

上一篇文章我们总结了多线程最基础的知识点Thread,我们知道了如何开启一个新的异步线程去做一些事情.可是当我们要开启很多线程的时候,如果仍然使用Thread我们需要去管理每一个线程的启动,挂起和终止,显然是很麻烦的一件事情.还好.net framework为我们提供了线程池ThreadPool来帮助我们来管理这些线程,这样我们就不再需要手动地去终止这些线程.这一篇文章就让我们来学习一下线程池ThreadPool吧.关于它我想从以下几个方面进行总结. 认识线程池ThreadPool Thread

iOS开发多线程篇—创建线程

iOS开发多线程篇—创建线程 一.创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建.启动线程 (1) NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [thread start]; // 线程一启动,就会在线程thread中执行self的run方法 主线程相关用法 + (NSThread *)mainThread; // 获得主线程 -

Java多线程系列 JUC线程池07 线程池原理解析(六)

 关闭“线程池” shutdown()的源码如下: public void shutdown() { final ReentrantLock mainLock = this.mainLock; // 获取锁 mainLock.lock(); try { // 检查终止线程池的“线程”是否有权限. checkShutdownAccess(); // 设置线程池的状态为关闭状态. advanceRunState(SHUTDOWN); // 中断线程池中空闲的线程. interruptIdleWork

C#多线程学习 之 线程池[ThreadPool](转)

在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPool(线程池)来解决: 另一种情况:线程平时都处于休眠状态,只是周期性地被唤醒                   这一般使用Timer(定时器)来解决: 本篇文章单单讲线程池[ThreadPool] ThreadPool类 MSDN帮助信息: http://msdn.microsoft.com/z

C#多线程学习 之 线程池[ThreadPool]

在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPool(线程池)来解决: 另一种情况:线程平时都处于休眠状态,只是周期性地被唤醒                   这一般使用Timer(定时器)来解决: 本篇文章单单讲线程池[ThreadPool] ThreadPool类 MSDN帮助信息: http://msdn.microsoft.com/z

多线程二:线程池(ThreadPool)

在上一篇中我们讲解了多线程的一些基本概念,并举了一些例子,在本章中我们将会讲解线程池:ThreadPool. 在开始讲解ThreadPool之前,我们先用下面的例子来回顾一下以前讲过的Thread. 1 private void Threads_Click(object sender, EventArgs e) 2 { 3 Console.WriteLine($"****************btnThreads_Click Start {Thread.CurrentThread.Manage

【多线程】设置线程池线程数量

一.需求        Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为CPU核数的2倍,有些业务设置为CPU核数的8倍,有些业务设置为CPU核数的32倍.“工作线程数”的设置依据是什么,到底设置为多少能够最大化CPU性能. 二.一些共性认知        在进一步深入讨论之前,先以提问的方式就一些共性认知达成一致.        提问:工作线程数是不是设置的越大越好?        回