J2SE5.0中的线程缓冲 ---- 线程池

一、前言

用Java编写多线程程序已经是一个非常简单的事了,不过与其它多线程系统相比,一些高级特性在Java中仍然不具备,然而在J2SE5.0中这一切将会改变。J2SE5.0增加大量的线程相关类使得编写多线程程序更加容易!

二、线程池-Thread Pools

线程库的基本思想简单的讲就是,一个线程库中拥有一定数量的线程,当有任务要执行时,就从线程库中找一个空闲的线程来执行这个任务,任务执行完后,该线程返回线程库等待下一个任务;如果线程库中没有空闲的线程来执行该任务,这时该任务将要等待直到有一个空闲的线程来执行它。这听起来有点不爽,那么我们为什么还要使用线程库呢?

三、使用线程库的三大理由

重用线程能够获得性能上的好处。在多线程环境中,创建一个线程要花很高的代价。线程库使得线程能够被重用,当有大量任务要执行时,线程库避免了不断创建与销毁线程所带来的系统开销,使用得你的程序整体运行效率得到了一定程度的提高。

还有一个很重要的原因就是,线程库考虑到了较好的程序设计。如果有大量任务要执行,如果不用线程库,你不得不不重复创建一个线程、管理这个线程的生命同期的代码。断重复这些步骤是一件很乏味的工作,因为这与我们的业务逻辑(任务)无关。使用线程库,这一切将由线程库代为管理,你只需关注于你的商务逻辑,当要执行一个任务时,你只需简单的创建一个任务,并把它丢给线程库去执行就OK。

最后一个也是最为重要的一个:当有大量任务需要同时执行时,线程库能够带来重大的性能提升。这一点看上去与第一点相似,事实上,任何时候活动的线程都比CPU数量多得多,因此线程库能够充分利用CPU的时间片,使得程序看去上运行较快且高效。

四、如何使用线程库

在使用线程库需要做两件事:创建任务及建立线程库本身。

一个任务是一个实现了Runnable或Callable接口的对象。

线程库则基于Executor接口。

java.util.concurrent.Executor


java.util.concurrent.ExecutorService


java.util.concurrent.ThreadPoolExecutor

package java.util.concurrent;
public class ThreadPoolExecutor implements ExecutorService ...{
   public ThreadPoolExecutor(int corePoolSize,
                int maximumPoolSize,
                long keepAliveTime,
                TimeUnit unit,
                BlockingQueue<Runnable> workQueue);
   public ThreadPoolExecutor(int corePoolSize,
                int maximumPoolSize,
                long keepAliveTime,
                TimeUnit unit,
                BlockingQueue<Runnable> workQueue,
                ThreadFactory threadFactory);
   public ThreadPoolExecutor(int corePoolSize,
                int maximumPoolSize,
                long keepAliveTime,
                TimeUnit unit,
                BlockingQueue<Runnable> workQueue,
                RejectedExecutionHandler handler);
   public ThreadPoolExecutor(int corePoolSize,
                int maximumPoolSize,
                long keepAliveTime,
                TimeUnit unit,
                BlockingQueue<Runnable> workQueue,
                ThreadFactory threadFactory,
                RejectedExecutionHandler handler);
}

时间: 2024-09-08 22:42:22

J2SE5.0中的线程缓冲 ---- 线程池的相关文章

J2SE5.0中最有趣的新特性:注释(annotation)

本文为原创,如需转载,请注明作者和出处,谢谢! 本文曾发表于IT168:http://tech.it168.com/j/e/2006-09-29/200609291054707.shtml     本文将向你介绍J2SE5.0中的新特性之一:注释.本文将从什么是注释:J2SE5.0中预定义的注释:如何自定义注释:如何对注释进行注释以及如何在程序中读取注释5个方面进行讨论. 一.什么是注释     说起注释,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描

学习笔记-标签使用(J2SE5.0)中的元数据

j2se|笔记|数据 方法和注释 要把你的JAVA代码和AOP结合起来,可以使用一些标签,就像新的JDK5.0版本中的元数据以及XDoclet .对于你的JAVA方法,就有点像使用synchronized一样.当你把你的方法标注为synchronized,就表明 你高数JVM你的这个方法在执行的使用是需要同步的.注释标签允许你定义新的关键词用来处理你自己 的特殊行为.AOP就使你有了把这些织入到你的应用中,以使应用可以执行的能力. 让我们看看我们使用自己定义的标签@Oneway来使一个方法在后台

一起谈.NET技术,4.0中的并行计算和多线程详解(二)

相关文章:4.0中的并行计算和多线程详解(一) 多线程部分 多线程在4.0中被简化了很多,仅仅只需要用到System.Threading.Tasks.::.Task类,下面就来详细介绍下Task类的使用. 一.简单使用 开启一个线程,执行循环方法,返回结果.开始线程为Start(),等待线程结束为Wait(). Code         /// <summary>         /// Task简单使用         /// </summary>         private

J2SE5.0 实例---变长参数

j2se 变长参数(Varargs)与泛型一样,变长参数是C++中有而Java中没有的一种语言特性,在过去如果我们想向一个函数传递可变数量的函数,就必须首先将这些参数放入一个数组中,然后将数组传递给函数.就如同下面所作的一样: Object[] arguments = { 640, "kb", "anybody", "Bill Gates" }; String result = MessageFormat.format(      "{

注释在J2EE5.0中的完美应用

随着J2EE进入5.0时代后,J2SE5.0的很多特性也被广泛应用在J2EE程序中.而J2SE5.0的注释(Annotations)特性就是其中应用最广泛的特性之一. 在以前的J2EE版本中,都是使用大量的配置文件来设置Web程序.EJB等.但这一切在J2SE5.0中得到了彻底的改善.在J2EE5.0的注释中的一些是专门针对Web和EJB程序的.如@Resource, @EJB和@WebServiceRef等.其它的一些注释,如@RunAs和@DeclareRoles则和安全相关. 虽然我们可以

java 线程池中如何自定义每个线程名称

问题描述 java 线程池中如何自定义每个线程名称 **java 线程池中如何自定义每个线程名称 java 线程池中如何自定义每个线程名称 ** 解决方案 补充下,线程池的创建线程池对象时,有一个参数是ThreadFactory类型,如果不传递,默认用的是DefaultFactory,我们可以自定义一个ThreadFactory然后作为参数传到进去,这个类里面就可以自定义线程池中创建的线程的名称.api: public ThreadPoolExecutor(int corePoolSize,in

在dotnet4.0的webForm项目中,想用线程解决加载慢,服务器响应时间慢的问题

问题描述 在dotnet4.0的webForm项目中,想用线程解决加载慢,服务器响应时间慢的问题 在dotnet4.0的webForm项目中,想用线程解决加载慢,服务器响应时间慢的问题,但是发现我新开一个线程让他去加载数据的时候,他就获取不到HTTP请求了,请大侠们多多帮忙,小的感激不尽!谢谢大家! 解决方案 设置下超时,超时是不是太短了.

Java游戏起步:(一)线程与线程池

任何游戏都至少需要运行两个线程,主线程和GUI线程而线程池是一个管理运行线程的有用工具,下面的代码示范了一个线程池的实现方法~~************************************************(ThreadPool.java)import java.util.LinkedList; /** 线程池是一组线程,限制执行任务的线程数*/public class ThreadPool extends ThreadGroup { private boolean isAli

关于C#线程,线程池和并行运算的简单使用和对比

前言:看了书上两个使用C#4.0并行编程的demo,又对照以前收藏的网上几篇讲述线程池的雄文,一并整理,写个示例总结一下.写这篇文章的时候,发现关于线程的好几个基础的重要的知识点自己都不熟悉,而且可能习惯性认知浅薄,所以痛苦的无以复加,不知道到底要说什么.不想看文章的可以直接下载最后的示例,本文代码主要参考Marc Clifton的".NET's ThreadPool Class - Behind The Scenes",对新手也许有帮助. 参考: http://msdn.micros