如何通过Maven的Tomcat插件运行Web工程
Future接口
Future表示一个异步计算任务的结果。
Future接口方法有:
boolean cancel(boolean mayInterruptIfRunning):取消异步运算。入参为true时,表示会取消已经开始执行的运算。为false时,不会取消已经开始执行的运算。
boolean isCancelled():
boolean isDone():任务结束的话,返回true,否则返回false。任务结束不仅仅指任务顺利完成,还包括任务抛异常、任务被取消等。
V get() throws InterruptedException, ExecutionException:在主线程中获取异步运算的结果,在获取到结果之前主线程一直阻塞。如果任务执行抛异常,则get()方法会抛出ExecutionException异常。如果任务被取消,则get()会抛出CancellationException异常。
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException:在主线程中获取异步运算的结果,在获取到结果之前主线程阻塞,超过指定时间后会抛出TimeoutException异常。
RunnableFuture接口
RunnableFuture接口继承了Runnable接口和Future接口,但并未定义自己的方法。
FutureTask是RunnableFuture实现类。FutureTask有两个构造器:FutureTask(Callable<V> callable)和FutureTask(Runnable runnable, V result)。
TODO示例
FutureTask的run()实例方法内部是调用Runnable实例或者Callable实例的run()方法,但是是在主线程执行,而不是在异步线程执行。这j8有啥用???
ListenableFuture接口
其实ListenableFuture接口有两个,但都不是jdk自带的,guava一个,spring一个。
guava的ListenableFuture接口全类名是com.google.common.util.concurrent.ListenableFuture,继承了Future接口,只定义了一个方法:void addListener(Runnable listener, Executor executor)。常用实现类是guava的ListenableFutureTask类,全类名是com.google.common.util.concurrent.ListenableFutureTask。
spring的ListenableFuture接口在spring-core.jar包中,全类名是org.springframework.util.concurrent.ListenableFuture,继承了Future接口,定义方法如下:
void addCallback(ListenableFutureCallback<T> callback):注册一个ListenableFutureCallback实例。
void addCallback(SuccessCallback<T> successCallback, FailureCallback failureCallback):注册一个SuccessCallback实例和一个failureCallback实例。
completableFuture<T> completable():把一个spring的ListenableFuture实例转成一个jdk的CompletableFuture实例。
spring的ListenableFuture接口常用实现类是spring的ListenableFutureTask和AsyncResult。
guava ListenableFutureTask使用示例:
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
ListeningExecutorService service = MoreExecutors.listeningDecorator(executorService);
long begin = System.currentTimeMillis();
ListenableFuture<Boolean> booleanTask = service.submit(() -> {
Thread.sleep(1000);
System.out.println("1, currentThread= " + Thread.currentThread().getName());
System.out.println("".substring(0, 1));
return true;
});
booleanTask.addListener(() -> {
try {
booleanTask.get();
Thread.sleep(2000);
System.out.println("2, currentThread= " + Thread.currentThread().getName());
} catch (Exception e) {
System.out.println(123);
// e.printStackTrace();
}
}, executorService); Futures.addCallback(booleanTask, new FutureCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
System.out.println("3, currentThread= " + Thread.currentThread().getName() + ", booleanTask result= " + result);
} @Override
public void onFailure(Throwable e) {
System.out.println(234);
// e.printStackTrace();
}
}, executorService);
System.out.println("cost " + (System.currentTimeMillis() - begin) + "ms");
}
利用guava的MoreExecutors工具类构造出ListeningExecutorService实例,调用此实例的submit()方法即可得到一个ListenableFuture实例。接下来可以调用ListenableFuture的addListener(Runnable listener, Executor executor)方法添加一个监听任务,但这个方法说实话,不好。为什么呢?因为addListener()方法添加的监听任务不管被监听任务是否抛异常都会执行,要是想不抛异常执行一个任务,抛异常时执行另一个任务,就要用try catch把ListenableFuture实例的get()方法包裹,然后在try子句中写不抛异常时要执行的任务,catch子句中写抛异常时要执行的任务。不如用guava提供的Futures工具类,这个工具类中提供了很多静态方法,其中addCallback(ListenableFuture<V> future, FutureCallback<V> callback, Executor executor)方法可以轻松实现ListenableFuture任务抛异常和不抛异常时监听任务的不同分支。
FluentFuture类
FluentFuture是guava提供的类,在com.google.common.util.concurrent包中,全类名是com.google.common.util.concurrent.FluentFuture。
待研究
spring ListenableFutureTask使用示例:
TODO示例
AsyncResult类
AsyncResult是spring提供的类,在spring-context.jar包中,全类名是org.springframework.scheduling.annotation.AsyncResult。AsyncResult实现了ListenableFuture接口。
AsyncResult使用示例:
public static void main(String[] args) throws NoSuchAlgorithmException {
AsyncResult<Number> asyncResult = new AsyncResult<>(getRandom());
asyncResult.addCallback(result -> {
System.out.println("result= " + result + ", currentThread= " + Thread.currentThread().getName());
}, e -> {
System.out.println("e= " + e.getMessage() + ", currentThread= " + Thread.currentThread().getName());
}
);
} private static Double getRandom() throws NoSuchAlgorithmException {
SecureRandom secureRandom = SecureRandom.getInstanceStrong();
return secureRandom.nextDouble();
}
这下终于按照预期打印了。
CompletableFuture接口
待研究
如何通过Maven的Tomcat插件运行Web工程的更多相关文章
- 如何通过Maven的Jetty插件运行Web工程
首先建议使用jetty9,因为据官方文档显示,Jetty 7 and Jetty 8 are now EOL (End of Life),如下.但是由于项目使用的版本一般都比较低,这里以jetty8为 ...
- (转)淘淘商城系列——使用maven tomcat插件启动web工程
http://blog.csdn.net/yerenyuan_pku/article/details/72672138 上文我们一起学习了怎样搭建maven工程,这篇文章我就来教大家一起学习怎样用to ...
- 购物商城学习--第三讲(tomcat插件启动web工程)
此处提到的tomcat插件即maven工程集成的tomcat插件,可以在添加maven的tomcat插件之后,在本地通过脚本或者命令行方式运行web工程,tomcat插件启动只需要修改一个端口即可,非 ...
- myeclipse maven tomcat插件 创建web工程
自从有了云笔记,很久不写博客了.今天写了使用Freemarker静态化JSP页面,索性就发出来.初学,勿喷. 这篇文字以前放在云笔记里,当然里面有很多借鉴网络上的东西,而自己也使用Maven很久了,索 ...
- (转)淘淘商城系列——使用maven tomcat插件启动聚合工程
http://blog.csdn.net/yerenyuan_pku/article/details/72672389 上文我们一起学习了如何使用maven tomcat插件来启动web工程,本文我们 ...
- Maven集成Tomcat插件
目录 类似插件及版本区别: 本地运行,启动嵌入式tomcat: 错误一: 错误二: Idea运行调试: vscode运行调试: 远程部署: 项目中的pom.xml配置: Tomcat中的tomcat- ...
- IntelliJ IDEA配置Tomcat/Jetty运行Web项目
一.使用Maven的POM引入插件的形式: 这种方式只需在POM中引入Tomcat/Jetty的插件即可运行.参考:http://www.cnblogs.com/EasonJim/p/6687272. ...
- Intellij IDEA如何使用Maven Tomcat Plugin运行web项目(转)
首先,Run --> Edit Configurations,这时候如下图: 然后点击左上角的加号,可以添加一个新的配置,如下图: 选择Maven,如下图: 下面填上自己的配置信息,点击appl ...
- Intellij IDEA如何使用Maven Tomcat Plugin运行web项目
首先,Run ——> Edit Configurations,这时候如下图: 然后点击左上角的加号,可以添加一个新的配置,如下图: 选择Maven,如下图: 下面填上自己的配置信息,点击appl ...
随机推荐
- background-size (设置背景图片的大小)
设置背景图片的大小,以长度值或百分比显示(数值包括 长度length和百分比percentage),还可以通过cover和contain来对图片进行伸缩. 语法:background-size: au ...
- CentOs + Nginx + php-fpm + MySql 依赖库安装
依赖库和开发工具 yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype free ...
- CNN计算过程
- HDU 5860 Death Sequence(递推)
HDU 5860 Death Sequence(递推) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5860 Description You ...
- HDU 2516 取石子游戏 斐波纳契博弈
斐波纳契博弈: 有一堆个数为n的石子,游戏双方轮流取石子,满足: 1)先手不能在第一次把所有的石子取完: 2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍) ...
- mysql近几天的查询
今天:select*from table1 where to_days(时间字段名)=to_days(now()); 昨天:select*from table1 where to_days(now() ...
- redis8--数据持久化两种方式
持久化功能redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会把硬盘中的数据恢复到内存(redis)的里边.数据保存到硬盘的过程就称为"持久化&qu ...
- Struts2拦截器配置
1. 理解拦截器 1.1. 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截是AO ...
- angular指令
转自:http://www.cnblogs.com/rohelm/p/4051437.html 对于指令,可以把它简单的理解成在特定DOM元素上运行的函数,指令可以扩展这个元素的功能. 首先来看个完整 ...
- Dubbo入门实例 本地伪集群测试Demo
1. 概述 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案 Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提 ...