java学习笔记 线程池的使用1
2011-05-29 21:19
501 查看
多线程编程技术已经成为现在开发人员必不可少的一项重要技能。在很多情况下可以改善程序的响应性能,提高资源的利用效率,在如今多核CPU的年代里,这些显得更为重要。
一般的,对于使用多线程的来完成指定的任务,首先我们需要创建线程对象,然后使线程执行,线程执行完毕后即会被系统垃圾回收,不能再启动执行了。再此种模式下很多时候会严重影响程序的执行性能,因为创建线程对象以及清理回收线程垃圾都会大量暂用CPU等系统资源。所以为了解决这方面的问题我们使用了线程池。
在项目的开发当中有着各种不同类型的线程池,常用的大致有以下两种:
1.固定尺寸的线程池;
2.可变尺寸的线程池;
该片文章首先简介下固定线程池的用法:
取固定线程池对象:通过Executors类的静态工厂方法来获取
public static ExecutorService newFixedThreadPool(int nThreads)
其中的nThread为线程池的尺寸。
public static ExecutorService newSingleThreadExecutor()
该方法类似于newFixedThreadPool(1),在同一时刻只可以执行一个任务。可以保证多个任务顺序执行。
上面两个静态工厂方法返回的都是对ExecutorService接口类型的引用,其实此引用指向的就是线程池对象,我们可以调用其中的execute方法来使线程池中的线程执行指定的任务。
void execute(Runnable command)
下面是一个简单的使用固定线程池的例子
newSingleThreadExecutor()的使用方法于此类似,此处就不做说明了。
谢谢
一般的,对于使用多线程的来完成指定的任务,首先我们需要创建线程对象,然后使线程执行,线程执行完毕后即会被系统垃圾回收,不能再启动执行了。再此种模式下很多时候会严重影响程序的执行性能,因为创建线程对象以及清理回收线程垃圾都会大量暂用CPU等系统资源。所以为了解决这方面的问题我们使用了线程池。
在项目的开发当中有着各种不同类型的线程池,常用的大致有以下两种:
1.固定尺寸的线程池;
2.可变尺寸的线程池;
该片文章首先简介下固定线程池的用法:
取固定线程池对象:通过Executors类的静态工厂方法来获取
public static ExecutorService newFixedThreadPool(int nThreads)
其中的nThread为线程池的尺寸。
public static ExecutorService newSingleThreadExecutor()
该方法类似于newFixedThreadPool(1),在同一时刻只可以执行一个任务。可以保证多个任务顺序执行。
上面两个静态工厂方法返回的都是对ExecutorService接口类型的引用,其实此引用指向的就是线程池对象,我们可以调用其中的execute方法来使线程池中的线程执行指定的任务。
void execute(Runnable command)
下面是一个简单的使用固定线程池的例子
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class RegularThreadPool { /** * 对于固定线程池而言,如果需要执行的任务的数量大于线程池的尺寸,则有的任务要进入此线程池的等待队列 * @param args */ public static void main(String[] args) { RegularThreadPool pool = new RegularThreadPool(); //创建尺寸为2的固定线程池 ExecutorService threadPool = Executors.newFixedThreadPool(2); //创建三个任务对象 RegularThreadPool.MyTask mt1 = pool.new MyTask("Task1"); RegularThreadPool.MyTask mt2 = pool.new MyTask("Task2"); RegularThreadPool.MyTask mt3 = pool.new MyTask("Task3"); //启动三个任务执行 threadPool.execute(mt1); threadPool.execute(mt2); threadPool.execute(mt3); threadPool.shutdown(); } class MyTask implements Runnable { private String name; public MyTask(String name) { this.name = name; } public void run() { System.out.println("/n========任务" + name + "开始执行========"); for (int i = 0; i < 25; i++) { System.out.println("[" + name + "_" + i + "] "); } System.out.println("/n========任务" + name + "执行结束========"); } } }
newSingleThreadExecutor()的使用方法于此类似,此处就不做说明了。
谢谢
相关文章推荐
- JAVA学习笔记_BigDecimal使用
- 从使用到原理学习Java线程池
- Android(java)学习笔记89:泛型概述和基本使用
- Java Web 学习笔记之四:Cookie介绍及使用
- Java学习笔记27:模板Velocity使用方法
- 【Java学习笔记】使用for循环编写九九乘法表
- Java学习笔记---9.面向对象编程04-this关键字的使用
- Effective Java学习笔记 第60条: 优先使用标准的异常
- Android(java)学习笔记157:使用Dexdump等工具进行反编译
- Java学习笔记_3_包中类的使用
- java学习笔记(面向对象、类的使用、方法的重载)
- [每日学习笔记][2012.07.10]使用Java理解程序逻辑(六)
- Java for Web学习笔记(一零五):Spring框架中使用JPA(5)Isolation和C3P0(上)
- Android(java)学习笔记196:Android中Menu的使用(静态和动态)
- 使用java调用hadoop接口学习笔记
- 【Java学习-J.160430.0.15】笔记8-使用JDBC连接数据库
- 13.笔记JAVA Spring框架学习————Bean使用SpEL
- Java学习笔记十四:如何定义Java中的类以及使用对象的属性
- Android(java)学习笔记187:Android中操作XML数据(使用Pull解析器)
- java学习笔记6 - 使用commons configuration管理配置文件