- 浏览: 1333925 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (471)
- 原创文章 (4)
- Database (84)
- J2SE (63)
- Web (26)
- Javascript (30)
- Lucene (11)
- os (13)
- 算法 (8)
- Webservice (1)
- Open projects (18)
- Hibernate (18)
- Spring (15)
- Css (2)
- J2ee (2)
- 综合技术 (18)
- 安全管理 (13)
- PatternsInJava (27)
- NIO (5)
- Ibatis (2)
- 书籍收藏 (1)
- quartz (7)
- 并发编程 (15)
- oracle问题 (2)
- ios (60)
- coco2d-iphone (3)
- C++ (6)
- Zookeeper (2)
- golang (4)
- animation (2)
- android (1)
最新评论
-
dandingge123:
【引用】限制UITextField输入长度的方法 -
qja:
...
对List顺序,逆序,随机排列实例代码 -
安静听歌:
现在在搞这个,,,,,哎~头都大了,,,又freemarker ...
通用大型网站页面静态化解决方案(一) -
springdata-jpa:
java quartz定时任务demo教程源代码下载,地址:h ...
Quartz 配置参考 -
马清天:
[b][/b][list][*]引用[u][/u][/list ...
通用大型网站页面静态化解决方案(一)
JDK5中增加了Doug Lea的并发库,这一引进给java线程的管理和使用提供了强大的便利性。 java.util.current包中提供了对线程优化、管理的各项操作,使得线程的使用变得的心应手。该包提供了线程的运行,线程池的创建,线程生命周期的控制,线程间的协作等功能。
一、核心API介绍
1、 Executor接口
public void execute(Runnable runnable);
该接口声明了execute方法,将Runnable对象传入,启动该方法相当于启动了该线程
2、ExecutorService接口
该接口是Executor的子接口,提供了submit方法,该方法返回Future对象,Future可用于控制线程的执行与取消
3、ScheduledExecutorService接口
该接口是ExecutorService的子接口,提供了线程启动时机的控制
4、Callable接口
提供了如下方法
public Object call() throws Exception;
该接口类似Runnable接口,只是有返回值和抛出的异常,该方法返回的值就是ExecutorService接口调用
submit(Callable call)方法的Future调用get方法返回的值。
5、Future接口
Future接口用于控制线程的执行。调用cancell(boolean bool)方法将会取消正在运行的进程。
另外ExecutorService的shutDown()方法将启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用;shutDownNow()方法试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。
6、Executors
这是一个线程池的工厂类,该类提供了许多生成Executor,ExecutorService,ScheduleExecutorService的工厂方法。
其实,Executor就相当于一个线程池,提供对线程的管理功能,包括启动线程,取消线程执行,加入线 程,移除线程,以及协调线程之间的工作等功能,这些随着Executor级别(即子接口,实现类)越高而功 能越强。
二、应用简介
1、启动一个线程
Executor executor=Executors.newFixedThreadPool(3);
executor.execute(new Runnable(){
public void run(){
//your code
}
});
也可以启动Callable形式的线程
ExecutorService executor=Executors.newFixedThreadPool(3);
executor.submit(new Callable(){
public Object call()throws Exception{
Object o=null;
// your code;
return o;
}
});
注意,以上的方法每执行一次就运行一次Runnable或Callable对象的run(),call()方法,如果生成的Executor对象指定了数目,例如上面中是3,则当调用execute方法或submit方法时到达3次以上时,实际上同时运行的线程最多只有3个,是按照顺序的(即多出来的,后放进去的线程没有运行),只有当Executor池中正在运行的线程少于3个(即某些线程处于idle空虚状态,不在运行了),其后多出来的线程才会开始运行(按调用执行的顺序),但任何时候最多只能有3个线程运行。
同一个线程可以被执行多次,多长调用执行方法就行了。
2、取消线程的执行
当想终止线程的执行时,可以调用Future的cancell方法,但也不一定能够终止;另外如果是ExecutorSrvice,也可以调用shutDownNow或者shutDown方法。shutDown方法将等待当前的线程执行完毕后终止所有的线程,而shutDownNow试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。
3、顺序执行线程
ExecutorService executor=Executors.newFixedThreadPool(3);
Future future=executor.submit(r1);//r1是Runnable或Callable实例
future.get();
executor.submit(r2);/r2是Runnable或Callable实例
以上代码将会使r1执行完后再执行r2,因为Future的get方法具有阻塞调用者线程的功能,执行get方法时,将会等待Future对应的线程执行完毕后才会返回结果,其会阻塞调用者线程。
4、从线程池中添加与移除线程
要移除线程,则需要ExecutorService接口的实现类ThreadPoolExecutor或其子类的方法。
在线程池中添加线程
调用execute或submit方法都可以将线程加入线程池,对同一个线程重复调用也可以,也相当于调用2个不同线程,只不过执行相同的代码。
在线程池中删除线程
public boolean remove(Runnable task)
从执行程序的内部队列中移除此任务(如果存在),从而如果尚未开始,则其不再运行,如果已经删除则返回true
public void purge()
尝试从工作队列移除所有已取消的 Future 任务。
5、线程的协作
利用CyclicBarrier可以协调线程的之间的运行,它允许一组线程互相等待,直到到达某个公共屏障点。
例如有一项工作需要有2个人完成,而这项工作有2个步骤,只有在执行第一个步骤只后,才可以执行第二个步骤,每一个步骤都需要2个人参与。这时可以使用CyclicBarrier了。2个人代表2个线程,如下。
class Worker implements Runnable{
private Work work;
private int speed;
public Work(Work work,int speed){
this.work=work;
this.speed=speed;
}
public void run(){
work.worked(speed);
}
}
class Work {
private CyclicBarrier barrier;
public Work(CyclicBarrier barrier){
this.barrier=barrier;
}
public void worked(int speed){
firstWork(speed);
secondWork();
}
private void firstWork(int speed){
barrier.await();
try{
Thread.sleep(speed);
}catch(Exception e){
}
}
private void secondWork(){
barrier.await();
}
}
public static void main(String args[]){
CyclicBarrier barrier=new CyclicBarrier(2);
Work work=new Work(barrier);
Worker worker1=new Worker(work);
Worker worker2=new Worker(work);
Executor executor=Executors.newFixedPoolThread(2);
executor.execute(worker1);
executor.execute(worker2);
}
6、线程池的线程回收
CompletionService是一个管理执行完毕的线程的类,以Executor为参数构造实例。submit方法用于提交任务,似乎是委派给Executor执行,而take()方法则是获取并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则等待。,pool也类似只不过当时没有时返回null并不等待。
原文地址:http://blog.sina.com.cn/hss117
发表评论
-
J2ME 的优化措施
2012-07-11 02:15 1174常见的性能瓶颈:1.文件的读写和网络的操作2.CPU3.内存4 ... -
JAVA缓存 - Cache类
2011-09-28 11:04 4612JAVA缓存有两种: 一、文件缓存,是指把数据存储在磁盘上 ... -
Java注释(Annotation)详解
2011-03-31 18:22 2399注释:在一个类中可以有多个,类似于一个类可以有多个实例; ... -
Java去除字符串中的空格、回车、换行符、制表符
2011-02-15 11:06 3554本方法采用的是java的正则表达式 import jav ... -
线程池编程
2011-01-23 21:02 1104线程池编程 -
设计模式:Java语言中的应用
2011-01-23 20:59 1319设计模式:Java语言中的应用 -
java用了中间缓存变量
2011-01-23 18:37 2394Java语法、语言特性与机制 2011-01-22 19:1 ... -
Java集合总结
2011-01-19 11:16 3819Set:不区分元素的顺序,不允许出现重复的值list:区分元素 ... -
线程池
2011-01-08 21:03 2069对每个客户都分配一个新的工作线程。当工作线程与客户通信结束,这 ... -
SimpleDateFormat
2010-12-10 16:11 1362With SimpleDateFo ... -
使用 XStream 在 JavaBean 与 XML/JSON 之间相互转换
2010-12-10 14:24 1555XML 和 JSON 是当今常用的两种数据描述与传输的格式,特 ... -
Linux上JDK的 安装和卸载 详细 (转)
2010-11-27 15:48 1924安装 1. 去http://java.sun.com ... -
java 路径问题
2010-11-26 16:21 12961.JSP/Servlet中获得当前应用的相对路径和绝对路径 ... -
对synchronized(this)的一些理解
2010-11-25 23:41 1024一、当两个并发线程访问同一个对象object中的这个synch ... -
Externalizable
2010-11-20 22:41 1358被Serializable接口声明的类的对象的内容都将被序列化 ... -
Java实现文件拷贝的4种方法(转)
2010-11-15 12:33 1248... -
Java内省和反射机制三步曲之 - 内省
2010-11-11 12:15 1343经过多方面的资料搜集整理,写下了这篇文章,本文主要讲解java ... -
java内省机制
2010-11-11 11:10 2397反射 (Reflection):反射就是让你可以通 ... -
Design Pattern: Thread-Specific Storage 模式
2010-11-11 00:00 1209无论如何,要编写一个多执行绪安全(thread-safe)的程 ... -
Design Pattern: Two-phase Termination 模式
2010-11-10 23:59 1049Two-phase Termination直译的话是“两相终止 ...
相关推荐
### Java并发工具包 `java.util.concurrent` 知识点详解 #### 一、引言 随着多核处理器的普及和应用程序复杂度的增加,多线程编程成为了现代软件开发不可或缺的一部分。为了简化并发编程的复杂性,Java 5 引入了 `...
这个名为"Current-time-in-java.rar_Time"的压缩包文件很可能包含了一个简单的程序,用于演示如何在Java中获取并打印当前时间。让我们深入探讨一下Java中处理时间的机制。 在Java中,我们可以使用`java.util.Date`...
在Java编程语言中,API(Application Programming Interface)是一组预定义的类、接口、方法和其他组件,它们提供了标准的方式来实现特定的功能。Java API是Java开发的核心组成部分,它为程序员提供了丰富的功能,...
Java提供两种主要的方式来生成随机数:`java.lang.Math.random()` 和 `java.util.Random` 类。这两种方法各有优劣,适用于不同的场景。 #### Math.random() `Math.random()` 是一个简单易用的方法,用于生成一个...
根据提供的文件信息,我们可以总结出Java中日期处理的相关知识点,主要涵盖如何获取当前时间、不同格式的时间转换等操作。下面将详细阐述这些知识点。 ### 一、获取当前时间 在Java中,`java.util.Date`类可以用来...
在IT行业中,Base64是一种常见的数据编码方法,主要用于将二进制数据转换为ASCII字符串,以便在网络上传输或者存储。Base64Encoder和Base64Decoder是处理这种编码和解码过程的工具。本文将深入探讨这两个概念,以及...
解释:在 Spring 框架中,需要在 Java 主方法中实例化 ApplicationContext 对象,以便启动 Spring 应用程序。 第 4 题 题目:Consider the following code sample which creates an ApplicationContext from a file...
Java的`java.util.concurrent.locks.Condition`接口提供了这一功能。线程可以通过`await()`方法进入等待状态,直到收到`signal()`或`signalAll()`通知后唤醒。这在资源下载完成后更新进度或通知用户时非常有用。 五...
这个方法将`java.util.Date`对象转换成字符串。例如,传入`p_utilDate`和`"yyyy-MM-dd"`作为格式,则返回该日期的字符串表示形式。 #### 二、获取指定日期的各个组成部分 通过`java.util.Calendar`类可以方便地...
在Java中,我们可以使用多种方式来实现定时任务,如Java内置的`java.util.Timer`类、`java.util.concurrent.ScheduledExecutorService`,以及更强大的第三方库如Quartz Scheduler和Spring框架中的`@Scheduled`注解等...
在Java中,实现单例模式通常有多种方法,包括饿汉式、懒汉式(同步块)、双重检查锁定等。为了确保线程安全,这里采用双重检查锁定的方式实现。 1. **类定义**:首先定义一个名为`Logger`的类,该类包含一个私有的...
java.util.Date utilDate = new java.util.Date(); java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); ``` 7. **使用NIO进行快速文件拷贝**: - Java的New IO(NIO)提供了高效且非阻塞的I/O...
Java提供了多种方式来获取当前系统时间,这些方法分布在不同的类中,如`java.util.Date`、`java.time`包下的类以及`java.sql.Timestamp`。下面我们将深入探讨如何使用Java获取当前时间,并提供相关的代码示例。 ...
在Java中,`java.util.Date`类型可以很容易地转化为`java.sql.Date`类型,后者主要用于数据库操作。只需通过构造函数即可完成转换: ```java java.util.Date utilDate = new java.util.Date(); java.sql.Date sql...
Java中的日期和时间处理主要依赖于`java.time`包,该包是自Java 8引入的一个新特性,提供了更加直观和强大的API。在更早的版本中,我们通常使用`java.util.Date`和`java.util.Calendar`类来处理日期和时间,但在现代...
解决这个问题的一个方法是使用`ScheduledExecutorService`,它是Java并发包`java.util.concurrent`中的一个接口,提供了更强大的多线程定时任务管理能力。 总的来说,Java Web应用中的定时任务可以根据具体需求选择...
java.util.Date utilDate = new java.util.Date(); java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); ``` 这里首先创建一个`java.util.Date`对象,然后使用其时间戳创建`java.sql.Date`。 ### 7. ...
Java 获取系统信息(CPU、内存、硬盘、进程等)的相关方法 Java 获取系统信息是指通过 Java 语言获取当前系统的各种信息,包括 CPU、内存、硬盘、进程等。下面将介绍两种获取系统信息的方法。 方法一:使用 Java ...
java.util.Date utilDate = new java.util.Date(); java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); ``` #### 解释 此片段展示了如何将 `java.util.Date` 对象转换为兼容 JDBC 的 `java.sql.Date`...
本文将详细介绍三种主要的方法:使用`java.util.prefs.Preferences`API、通过命令行导入注册表文件(`.reg`文件)以及使用第三方库如gdapi。 #### 二、方法1:使用`java.util.prefs.Preferences` `java.util.prefs....