- 浏览: 1777330 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
奔跑的小牛:
例子都打不开
如何使用JVisualVM进行性能分析 -
蜗牛coder:
好东西[color=blue][/color]
Lucene学习:全文检索的基本原理 -
lovesunweina:
不在haoop中是在linux系统中,映射IP的时候,不能使用 ...
java.io.IOException: Incomplete HDFS URI, no host -
evening_xxxy:
挺好的, 谢谢分享
如何利用 JConsole观察分析Java程序的运行,进行排错调优 -
di1984HIT:
学习了~~~
ant使用ssh和linux交互 如:上传文件
在Java 5.0之前启动一个任务是通过调用Thread类的start()方法来实现的,任务的提于交和执行是同时进行的,如果你想对任务的执行进行调度或是控制 同时执行的线程数量就需要额外编写代码来完成。5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接 池的线程池来执行任务。这个架构主要有三个接口和其相应的具体类组成。这三个接口是Executor, ExecutorService和ScheduledExecutorService,让我们先用一个图来显示它们的关系:
图的左侧是接口,图的右侧是这些接口的具体类。注意Executor是没有直接具体实现的。
Executor 接口: 是用来执行Runnable任务的,它只定义一个方法:
- execute(Runnable command ):执行Ruannable类型的任务
ExecutorService 接口: ExecutorService继承了Executor的方法,并提供了执行Callable任务和中止任务执行的服务,其定义的方法主要有:
- submit(task ):可用来提交Callable或Runnable任务,并返回代表此任务的Future对象
- invokeAll(collection of tasks ):批处理任务集合,并返回一个代表这些任务的Future对象集合
- shutdown():在完成已提交的任务后关闭服务,不再接受新任务
- shutdownNow():停止所有正在执行的任务并关闭服务。
- isTerminated():测试是否所有任务都执行完毕了。
- isShutdown():测试是否该ExecutorService已被关闭
ScheduledExecutorService 接口 在ExecutorService的基础上,ScheduledExecutorService提供了按时间安排执行任务的功能,它提供的方法主要有:
- schedule(task, initDelay ): 安排所提交的Callable或Runnable任务在initDelay指定的时间后执行。
- scheduleAtFixedRate():安排所提交的Runnable任务按指定的间隔重复执行
- scheduleWithFixedDelay():安排所提交的Runnable任务在每次执行完后,等待delay所指定的时间后重复执行。
重要的Executors 类
虽然以上提到的接口有其实现的具体类,但为了方便Java 5.0建议使用Executors的工具类来得到Executor接口的具体对象,需要注意的是Executors是一个类,不是Executor的复数 形式。Executors提供了以下一些static的方法:
- callable(Runnable task ): 将Runnable的任务转化成Callable的任务
- newSingleThreadExecutor: 产生一个ExecutorService对象,这个对象只有一个线程可用来执行任务,若任务多于一个,任务将按先后顺序执行。
- newCachedThreadPool(): 产生一个ExecutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用。
- newFixedThreadPool(int poolSize ):产生一个ExecutorService对象,这个对象带有一个大小为poolSize的线程池,若任务数量大于poolSize,任务会被放在一个queue里顺序执行。
- newSingleThreadScheduledExecutor:产生一个ScheduledExecutorService对象,这个对象的线程池大小为1,若任务多于一个,任务将按先后顺序执行。
- newScheduledThreadPool(int poolSize ): 产生一个ScheduledExecutorService对象,这个对象的线程池大小为poolSize,若任务数量大于poolSize,任务会在一个queue里等待执行
举例说明:
应用Executors来建立Thread pool
有时候您需要建立一堆Thread来执行一些小任务,然而频繁的建立Thread有时会是个开销,因为Thread的建立必须与作业系统互动,如果能建立一个Thread pool来管理这些小的Thread并加以重复使用,对于系统效能会是个改善的方式。
您可以使用Executors来建立Thread pool,Executors有几个static方法,列出如下:
方法 | 说明 |
newCachedThreadPool | 建立可以快取的Thread,每个Thread预设可idle 60秒 |
newFixedThreadPool |
包括固定数量的Thread |
newSingleThreadExecutor |
只有一个Thread,循序的执行指定给它的每个任务 |
newScheduledThreadPool | 可排程的Thread |
newSingleThreadScheduledExecutor | 单一可排程的Thread |
举个简单的实例,下面的程式使用newFixedThreadPool方法建立Thread
pool,当中包括五个可以重复使用的Thread,您可以指定Runnable物件给它,程式中会产生十个Runnable物件,由于Thread
pool中只有五个可用的Thread,所以后来建立的五个Runnable必须等待有空闲的Thread才会被执行:
- ExecutorDemo.java
package onlyfun.caterpillar; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ExecutorDemo { public static void main(String[] args) { ExecutorService service = Executors.newFixedThreadPool(5); for(int i = 0; i < 10; i++) { final int count = i; service.submit (new Runnable() { public void run() { System.out.println(count); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } }); } service.shutdown(); // 最后记得关闭Thread pool } }
submit()方法也接受实作Callable介面的物件,最后传回Future物件,可以取得Callable执行过后的传回结果。
如果想利用Executors进行排程,例如排定某个工作30秒后执行:
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( ); scheduler.schedule(new Runnable( ) { public void run() { // 排程工作 } }, 30, TimeUnit.SECONDS);
或排定某个工作5秒后执行,之后每30秒执行一次:
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( ); final ScheduledFuture future = scheduler.scheduleAtFixedRate(new Runnable( ) { public void run() { // 排程工作 System.out.println("t"); } }, 0, 5, TimeUnit.SECONDS); // 排定 60 秒后取消future scheduler.schedule(new Runnable( ) { public void run( ) { future.cancel(false); } }, 60, TimeUnit.SECONDS);
如上所示,想要取消排程任务,可以呼叫ScheduledFuture的cancel()方法。
发表评论
-
如何使用JVisualVM进行性能分析
2011-09-25 22:32 84850地址:https://visualvm.dev.java.ne ... -
JDK5中的concurrent包、线程池
2011-02-19 23:43 5018concurrent并发包里面几个 ... -
如何利用 JConsole观察分析Java程序的运行,进行排错调优
2010-11-12 18:38 187034一、JConsole是什么 从Java 5开始 引入 ... -
gentoo下 JAVA生成图片的问题 以及JFreeChart的图片问题
2010-11-05 17:21 6817=============================== ... -
JAVA NIO 详解Buffer类
2010-10-19 11:21 16525讲得很好,转载一下:http://www.java1995 ... -
简单的记录下 jconsole 查看远程机器的JAVA程序运行状况
2010-09-07 14:31 1760简单实用 远端: java \ ... -
项目管理 进度表
2010-06-27 14:43 3967项目管理中很重要的一部分 进度管理,进度管理又牵扯到进度表 ... -
JAVA基础 对象克隆 实现java.lang.Cloneable接口
2010-04-23 13:46 6047先来看看JDK的解释: ... -
深入浅出Java 类加载器
2010-03-05 11:42 4456简介: 类加载 ... -
Jave EE 6特性:依赖注入、Bean验证和EJB增强
2009-12-18 16:19 2047Java EE 的最新版本提供 ... -
JVM优化之调整大内存分页(LargePage)
2009-11-26 12:50 4187http://kenwu.me/tune-large-page ... -
java内存模型详解
2009-11-26 12:30 2433好读书求甚解,共享展 ... -
JVM调优总结(一)一些概念
2009-11-24 14:43 1443原文地址:http://pengjiahe ... -
CentOS 5.2下配置Java和TOMCAT环境
2009-10-17 14:29 3731安装JDK: 1、下载解压(tar zxvf jdk.. ... -
web项目定时执行任务
2009-08-27 18:19 4288xml文件内容-监听器 < ... -
JDK自带VM分析工具jps,jstat,jmap,jconsole
2009-08-09 10:24 35189一、概述 SUN ... -
log4j入门与提高-实例讲解
2009-08-04 09:47 6847官方网站:http://logging.apache.org/ ... -
获取Servlet运行环境信息-Servlet自身信息、Servlet服务器端信息和Servlet客户端信息
2009-07-08 15:01 7179在Servlet中可以很方便的获取各种运行环境信息,这些信 ... -
使用Perf4J进行性能分析和监控
2009-06-19 10:28 3508作者 Alex Devine 译者 崔 ... -
JAVA版PCX图象的RLE算法压缩与解压缩
2009-05-26 17:09 5932丰富JE的博客,把上大学时候的一个算法,搬过来,大概是2007 ...
相关推荐
java Java多线程 多线程 java Java多线程 多线程 java Java多线程 多线程
最新Java 5.0多线程编程。
Java多线程--JDK5.0新增线程创建方式
Java5.0多线程编程实践.pdf
Java自1995年面世以来得到了广泛得一个运用,但是对多...在Java 5.0之前Java里的多线程编程主要是通过Thread类,Runnable接口,Object对象中的wait()、 notify()、 notifyAll()等方法和synchronized关键词来实现的。
此代码,经过1000数量级的多线程并发访问测试。在四核CPU下也进行了多线程测试。保证了连接池在真多线程上同步访问的安全性。 里面包含了一个公开的接口。使用这个接口里面的函数。可以轻易创建使用数据库连接池...
javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip ...
1.7 Java 5.0多线程编程 1.8 Java Socket编程 1.9 Java的内存泄漏 1.10 抽象类与接口的区别 1.11 Java变量类型间的相互转换 2 JAVA与WEB 2.1 JMX规范 2.1.1 JMX概述 2.1.2 设备层(Instrumentation Level) 2.1.3 ...
javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip ...
Java精华学习资料 深入JAVA API 深入理解嵌套类和内部类 文件和流 java中的一些常用词汇 ...Java 5.0多线程编程 Java Socket编程 Java的内存泄漏 抽象类与接口的区别 Java变量类型间的相互转换 ……
教程视频:在 Java 5.0 提供了 java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的工具类, 用于定义类似于线程的自定义子系统,包括线程池,...还提供了设计用于多线程上下文中 的 Collection 实现等;
javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip 16....
java面试经常问到的问题,java的基础问题,多线程,spring mvc框架,jsp资源.Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点
169个实例,内容涉及Java的语言基础、面向对象程序设计、数字处理、数组与集合、字符串、异常处理、文件操作、多线程、Swing编程、图形和多媒体编程、反射机制、网络程序设计、数据库编程、Applet、Java与XML、Java ...