多线程编程——4种线程池

1、分类

  1. newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
  2. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
  3. newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
  4. newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

2、DOME

2.1 newCachedThreadPool

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:

 1 package test;
 2 import java.util.concurrent.ExecutorService;
 3 import java.util.concurrent.Executors;
 4 public class ThreadPoolExecutorTest {
 5     public static void main(String[] args) {
 6         ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
 7         for (int i = 0; i < 10; i++) {
 8             final int index = i;
 9             try {
10                 Thread.sleep(index * 1000);
11             } catch (InterruptedException e) {
12                 e.printStackTrace();
13             }
14                 cachedThreadPool.execute(new Runnable() {
15                 public void run() {
16                     System.out.println(index);
17                 }
18             });
19         }
20     }
21 }

线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

2.2 newFixedThreadPool

创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:

 1 package test;
 2 import java.util.concurrent.ExecutorService;
 3 import java.util.concurrent.Executors;
 4 public class ThreadPoolExecutorTest {
 5     public static void main(String[] args) {
 6         ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
 7         for (int i = 0; i < 10; i++) {
 8             final int index = i;
 9             fixedThreadPool.execute(new Runnable() {
10                 public void run() {
11                     try {
12                         System.out.println(index);
13                         Thread.sleep(2000);
14                     } catch (InterruptedException e) {
15                         e.printStackTrace();
16                     }
17                 }
18             });
19         }
20     }
21 }

因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。

定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()

2.3 newScheduledThreadPool

创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:

 1 package test;
 2 import java.util.concurrent.Executors;
 3 import java.util.concurrent.ScheduledExecutorService;
 4 import java.util.concurrent.TimeUnit;
 5 public class ThreadPoolExecutorTest {
 6     public static void main(String[] args) {
 7         ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
 8         scheduledThreadPool.schedule(new Runnable() {
 9             public void run() {
10                 System.out.println("delay 3 seconds");
11             }
12         }, 3, TimeUnit.SECONDS);
13     }
14 }

表示延迟3秒执行。

定期执行示例代码如下:

 1 package test;
 2 import java.util.concurrent.Executors;
 3 import java.util.concurrent.ScheduledExecutorService;
 4 import java.util.concurrent.TimeUnit;
 5 public class ThreadPoolExecutorTest {
 6     public static void main(String[] args) {
 7         ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
 8         scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
 9             public void run() {
10                 System.out.println("delay 1 seconds, and excute every 3 seconds");
11             }
12         }, 1, 3, TimeUnit.SECONDS);
13     }
14 }

表示延迟1秒后每3秒执行一次。

2.4 newSingleThreadExecutor

创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:

 1 package test;
 2 import java.util.concurrent.ExecutorService;
 3 import java.util.concurrent.Executors;
 4 public class ThreadPoolExecutorTest {
 5     public static void main(String[] args) {
 6         ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
 7         for (int i = 0; i < 10; i++) {
 8             final int index = i;
 9             singleThreadExecutor.execute(new Runnable() {
10                 public void run() {
11                     try {
12                         System.out.println(index);
13                         Thread.sleep(2000);
14                     } catch (InterruptedException e) {
15                         e.printStackTrace();
16                     }
17                 }
18             });
19         }
20     }
21 }

结果依次输出,相当于顺序执行各个任务。

http://cuisuqiang.iteye.com/blog/2019372

时间: 2024-11-08 16:38:09

多线程编程——4种线程池的相关文章

多线程编程学习笔记——线程池(一)

接上文 多线程编程学习笔记——线程同步(一) 接上文 多线程编程学习笔记——线程同步(二) 接上文 多线程编程学习笔记——线程同步(三) 创建多线程操作是非常昂贵的,所以每个运行时间非常短的操作,创建多线程进行操作,可能并不能提高效率,反而降低了效率. 如果你有非常多的执行时间非常短的操作,那么适合作用线程池来提高效率,而不是自行创建多线程. 线程池,就是我们先分配一些资源到池子里,当我们需要使用时,则从池子中获取,用完了,再放回池子里. .NET中的线程池是受CLR管理的,TheadTool类

多线程编程学习五(线程池的创建)

一.概述 New Thread的弊端如下:       a.每次New Thread新建对象性能差.       b.线程缺乏统一的管理,可能无限制的新建线程,相互之间竞争,极可能占用过多的系统资源导致死机 或者 OOM.       c.缺乏更多功能,如定时执行.定期执行.线程中断. Java提供的四种线程池的好处在于:       a.重用存在的线程,减少对象创建.消亡的开销,性能佳.       b.可有效控制最大并发线程数.提供系统资源的使用率,同时避免过多资源竞争,避免堵塞.     

C#多线程之旅(3)——线程池

v博客前言 先交代下背景,写<C#多线程之旅>这个系列文章主要是因为以下几个原因:1.多线程在C/S和B/S架构中用得是非常多的;2.而且多线程的使用是非常复杂的,如果没有用好,容易造成很多问题. v写在前面 多线程,有利也有弊,使用需谨慎. v正文开始 原文地址:C#多线程之旅(3)——线程池 C#多线程之旅目录: C#多线程之旅(1)——介绍和基本概念 C#多线程之旅(2)——创建和开始线程 C#多线程之旅(3)——线程池 C#多线程之旅(4)——同步本质 ...... 一.介绍 无论你什

Java多线程编程基础之线程对象

在进入java平台的线程对象之前,基于基础篇(一)的一些问题,我先插入两个基本概念. [线程的并发与并行] 在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent).而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel). 在上面包括以后的所有论述中,请各位朋友谅解,我无法用最准确的词语来定义储

Java程序猿必会的四种线程池

前言,对于Java程序猿来说,线程池是面试高频题,是我们必须掌握的一个技能,本篇文章主要给大家讲解四种线程池的使用. 线程池简介 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池.使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务. 线程池的工作机制: 在线程池的编程模式下,任务是提交给整个线程池,而不是直接提交给

多线程编程(进程和线程)

多线程编程(进程和线程) 1.进程:指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程可以启动多个线程. 2.线程:指程序中一个执行流程,一个进程中可以运行多个线程. 一.创建线程(两种方式) 二.线程的5种状态( New,Runnable,Running,Block,Dead ): 三.线程的优先级 四.守护线程 /精灵线程/后台线程 五.方法 六.同步代码锁(synchronized) 一.创建线程(两种方式): 方式1:采用继承Thread的方法 第一,继承 Thre

Java四种线程池的学习与总结

在Java开发中,有时遇到多线程的开发时,直接使用Thread操作,对程序的性能和维护上都是一个问题,使用Java提供的线程池来操作可以很好的解决问题. 一.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable(){ @Override public void run(){ //TODO Auto-generatedmethod stub } } ).start(); 那你就out太多了,new Thread的弊端如下:

Executors提供四种线程池

JAVA并发编程--EXECUTORS 线程池的思想是一种对象池的思想,开放一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完毕,对象归还给池.这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源. 代码: http://www.cnblogs.com/chenjingjing/articles/1683745.html 一.固定大小的线程池 newFixedThreadPool  二.单任务线程池 newSingleT

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

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