- 浏览: 89568 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
ssy341:
说的简单了点,和官网的文档差不多,多文件上传也不是很好,不过可 ...
jQuery插件AjaxFileUpload文件上传实现Javascript多文件上传功能 -
蓝凝幽偌:
有没有jar包?
org.apache.commons.net.ftp.FTPClient 的简单用法 -
tinguo002:
在这里缓缓走过,很为楼主钻研精神感动,也感谢楼主分享。
关于Struts2资源文件的配置
DK5中增加了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并不等待。
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并不等待。
发表评论
-
java编程思想final的理解
2015-03-06 13:38 382根据上下文环境,java的关键字final也存在着细微的区别, ... -
PDF2SWF中文字符集解决方案
2014-02-26 15:12 829转自:http://www.cnblogs.com/liver ... -
Runtime.getRuntime().exec() 输出流阻塞的解决方法
2014-02-26 09:40 1880转自:http://blog.csdn.net/xiaoani ... -
笔记(不用老搜索了)
2013-07-17 16:16 0下面代码则执行了subgo()函数, <a href ... -
利用LinkedBlockingQueue实现生产者-消费者模式
2013-06-05 16:09 718由于LinkedBlockingQueue 实现是线程安全的, ... -
加密123
2013-05-08 22:35 865/** * 加密传输时的密码 * @author weirhp ... -
jsoup解析
2013-04-28 15:31 715http://www.ibm.com/developerwor ... -
Tomcat - 解决which must be escaped when used within the value错误
2012-11-19 15:17 657http://www.cnblogs.com/javadu/a ... -
Java POI Word 写文档
2012-11-09 09:19 8761 package apache.poi; 2 3 ... -
使用COS组件实现文件上传
2012-06-15 11:25 1519转自:http://blog.csdn.net/jadyer/ ... -
Java Annotation(1)
2011-06-19 09:48 665作者:曾巧(numenzq) 摘要 Annotation( ... -
关于request得到路径的几种方法
2011-06-08 15:43 944request.getRequestURI() /jque ... -
JAVA EXCEL API 简介
2011-04-18 16:32 722转自:http://www.ibm.com/dev ... -
Hibernate 多对多双向关联
2011-03-21 11:09 620Hibernate 多对多双向关联 一、模型介绍 多个 ... -
Hibernate 一对多连接表双向关联
2011-03-21 11:09 767Hibernate 一对多连接表双向关联 一、模型介绍 ... -
Hibernate 一对多外键双向关联
2011-03-21 11:08 817Hibernate 一对多外键双向关联 一、模型介绍 ... -
Hibernate 一对一主键双向关联
2011-03-21 11:07 757Hibernate 一对一主键双向关联 一对一主键映射在一 ... -
Hibernate 一对一外键双向关联
2011-03-21 11:07 648Hibernate 一对一外键双向关联 一对一外键关联是一 ... -
Hibernate 多对多单向关联
2011-03-21 11:06 642Hibernate 多对多单向关联 一、模型介绍 多个人( ... -
Hibernate 多对一连接表单向关联
2011-03-21 11:05 714Hibernate 多对一连接表单向关联 一、模型介绍 ...
相关推荐
"java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError" 是一个典型的错误提示,它表明在并发执行过程中遇到了内存不足的问题。下面我们将深入探讨这个问题的原因、影响以及如何解决。 内存溢出...
java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:953) java.util.LinkedList$ListItr.next(LinkedList.java:886) JMeter.plugins.functional.samplers.websocket.ServiceSocket....
`java.util.concurrent.Executors` 继承自 `java.lang.Object`,作为一个工具类,它提供了一系列用于创建和管理线程池的方法,包括`ExecutorService`、`ScheduledExecutorService`、`ThreadFactory`和`Callable`等...
解决方案:Exceptionin thread "main" java.lang.UnsatisfiedLinkError:org.apache.hadoop.util.NativeCrc32.nativeCo
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
一个高性能的Java线程库,该库是 JDK 1.5 中的 java.util.concurrent 包的补充,可用于基于并发消息机制的应用。该类库不提供远程的消息功能,其设计的宗旨是实现一个内存中的消息传递机制. 主要特点有: * All ...
<Call Stack = DEBUG_FRAME = org.apache.axis2.util.JavaUtils.callStackToString(JavaUtils.java:564) DEBUG_FRAME = org.apache.axis2.description.ParameterIncludeImpl.debugParameterAdd(ParameterIncludeImpl...
java.util.ConcurrentModificationException 解决方法 在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除。 则使用会报以下异常: Java.util....
`java.util.concurrent.ExecutionException` 是Java并发编程中一个常见的异常,通常在执行Future对象的get()方法时抛出。这个异常表明在异步任务的执行过程中发生了异常。当我们使用ExecutorService提交任务并尝试...
本文详细介绍了 `java.util.logging.Logger` 的基本使用方法,包括如何创建 `Logger` 实例、理解日志级别以及如何自定义 `Handler`。这些知识点对于有效地管理和记录应用程序的日志信息至关重要。通过本文的学习,...
在Java编程语言中,处理日期和时间时经常使用到`java.util.Date`和`java.sql.Date`这两个类。它们虽然名字相似,但在实际应用中有很大的区别。 - **`java.util.Date`**:这个类提供了创建和操作日期/时间的功能,它...
- 在使用 `java.util.Date` 的 `getYear()` 和 `getMonth()` 方法时需要注意,`getYear()` 返回的值是从1900年开始计算的,需要加上1900才能得到实际年份;`getMonth()` 返回的是从0开始计算的月份,需要加上1。 - ...
发现问题 早上起来报错误,Jenkins打包到tomcat服务器,死活启动不起来,一些定时任务也没跑成功。 报错如下: org.apache.catalina.startup.ContextConfig.beforeStart ... at java.util.zip.ZipFile.(ZipFi
JavaMail的java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream错误 原因: MyEclipse6.5的javaee.jar中的mail包与JavaMail包有冲突。 解决: 在MyEclipse目录下(D:\Program Files\MyEclipse ...
字符串工具类,判定字符串是否为空等,封装各种字符串工具方法每个方法都有注释
3. **多线程**:Java提供了强大的多线程支持,`java.lang.Thread`类和`java.util.concurrent`包提供了创建和管理线程的方法。此外,还有同步机制如`synchronized`关键字和`Lock`接口。 4. **网络编程**:`java.net`...
`java.util.concurrent`包是Java提供的一个强大的多线程工具库,其中包含了许多类和接口,如`CountDownLatch`和`CyclicBarrier`,它们为程序员提供了更高级别的同步和协调机制。这篇文档将详细解析这两个工具类的...
为了简化并发编程的复杂性,Java 5 引入了 `java.util.concurrent` 包,提供了一系列强大的类和接口,帮助开发者更高效地管理多线程任务。 #### 二、`java.util.concurrent` 概览 `java.util.concurrent` 包提供了...
Java编程语言中,`java.util.Date` 和 `java.sql.Date` 都是用来处理日期的类,但它们在用途和特性上有所不同。理解这两者之间的差异对于进行数据库操作至关重要。 1. **`java.util.Date`**: - `java.util.Date` ...