异步解决方案中除了JMS,AJAX,DWR等外的简单选择,就是多线程(具体的就是这个包:java.util.concurrent)
为实现在WEB中需要执行一些耗时的操作,例如发发邮件之类,但是又不能影响前台页面的响应这种需求,多线程中列举2个程序来解决。分别是立即执行和计划任务式的执行,2种执行都是在主线程外另外建个线程,故不影响主线程。
package Executor;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/*
* MVC中的异步执行解决方案
* @Author 三上
*/
public class SingleThreadExecutor {
public static void main(String[] args) {
try {
// 创建一个单线程执行程序
ExecutorService executorService = Executors
.newSingleThreadExecutor();
final Runnable beeper = new Runnable() {
int count = 0;
public void run() {
System.out.println(new Date() + " beep " + (++count));
}
};
for (int i = 0; i < 100; i++) {
executorService.execute(beeper);
}
executorService.shutdown();
System.out.println("我是主线程,先执行我");
} catch (Exception e) {
}
}
}
package concurrent;
import static java.util.concurrent.TimeUnit.SECONDS;
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
/*
* ScheduledExecutorService 一个 ExecutorService,可安排在给定的延迟后运行或定期执行的命令。
* 要安排在某个以后的 Date 运行,可以使用:schedule(task, date.getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS)。
* 参考网址:http://www.kuqin.com/J2SE6-API/java/util/concurrent/ScheduledExecutorService.html
*/
public class TestScheduledThread {
public static void job() {
final ScheduledExecutorService scheduler = Executors
.newScheduledThreadPool(2);
final Runnable beeper = new Runnable() {
int count = 0;
public void run() {
System.out.println(new Date() + " beep " + (++count));
}
};
//Callable与Runnable得区别是,它有返回值
Callable callable=new Callable(){
int count = 0;
public Object call() {
System.out.println(new Date() + " callbeep " + (++count));
return count;
}
};
//1秒钟后运行,只执行1次
final ScheduledFuture beeperHandle3 = scheduler.schedule(callable, 1, SECONDS);
final ScheduledFuture beeperHandle4 = scheduler.schedule(beeper, 1, SECONDS);
// 1秒钟后运行,并每隔2秒运行一次
final ScheduledFuture beeperHandle = scheduler.scheduleAtFixedRate(
beeper, 1, 2, SECONDS);
// 2秒钟后运行,并每次在上次任务运行完后等待5秒后重新运行
final ScheduledFuture beeperHandle2 = scheduler.scheduleWithFixedDelay(
beeper, 2, 5, SECONDS);
// 30秒后结束关闭任务,并且关闭Scheduler
scheduler.schedule(new Runnable() {
public void run() {
beeperHandle.cancel(true);
beeperHandle2.cancel(true);
beeperHandle3.cancel(true);
beeperHandle4.cancel(true);
scheduler.shutdown();
}
}, 30, SECONDS);
}
public static void main(String[] args) {
job();
System.out.println("我这个执行完了,但是后面还有");
}
}
如果要求发完邮件后,能在前台显示“已发送完成”,那么就用下面这个:
package concurrent;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class TestFutureTask {
public static void main(String[] args) throws InterruptedException,
ExecutionException, TimeoutException {
final ExecutorService exec = Executors.newFixedThreadPool(5);
Callable call = new Callable() {
public String call() throws Exception {
Thread.sleep(1000 * 5);
return "Other less important but longtime things.";
}
};
Future task = exec.submit(call);
// 重要的事情
Thread.sleep(1000 * 3);
System.out.println("Let’s do important things.");
// 其他不重要的事情(比如发邮件等),30秒内如果不执行完,就返回null
Object obj = task.get(30,TimeUnit.SECONDS);
System.out.println(obj);
// 关闭线程池
exec.shutdown();
}
}
分享到:
相关推荐
在Web框架中,如使用了异步功能,开发人员可以编写非阻塞的代码,使得I/O密集型任务(如网络请求或数据库查询)可以在等待响应的同时执行其他任务,显著提升了整体效率。 这个框架可能是类似Tornado、Sanic或者...
全异步Swoole API开发框架是现代PHP开发中一种高效、高性能的选择,它结合了Promise、异步MySQL连接池、内存缓存管理和异步Task处理等关键特性,旨在为Web应用提供强大的并发处理能力。以下是对这些核心知识点的详细...
SanicDB是一个专门为Python的异步Web框架Sanic设计的数据库操作工具,旨在简化与MySQL数据库的交互。在异步编程环境中,效率至关重要,而SanicDB通过利用aiomysql.Pool,提供了一种轻量级的解决方案,以满足快速、非...
在基于SSH + jQuery框架的餐饮Web App设计与实现中,首先,开发环境选择Windows操作系统,利用Eclipse作为开发工具,这为开发者提供了一个集成化的开发环境,便于代码编写、调试和项目管理。数据库方面,选用Oracle...
首先,Java Web框架的核心目标是解决MVC(Model-View-Controller)模式中的问题。MVC是一种设计模式,用于分离业务逻辑、数据模型和用户界面,使得开发和维护更为简单。框架如Spring MVC、Struts 2和JSF(JavaServer...
这个框架由 Corvusoft 公司开发,旨在提供轻量级、高性能且易于使用的解决方案,帮助开发者快速实现 REST API。在 C++ 开发领域,Restbed 凭借其现代化的设计和对异步编程的支持,成为了一个颇具吸引力的选择。 ...
Python-msgsender是一个强大的工具,它基于著名的Tornado Web框架构建,设计用于实现异步消息发送功能。Tornado是一个开源的Python web框架和异步网络库,最初由FriendFeed开发,后来被Facebook收购并开源。其核心...
使用Swoole构建的Web框架,能够确保这些接口的快速响应和高并发处理能力,从而满足现代互联网应用的需求。 基于Swoole的Web开发框架通常具有以下特点: 1. **异步非阻塞I/O**:Swoole扩展实现了事件驱动和异步编程...
针对上述问题,本系统提出了一种新的Web服务调用框架设计与实现方案。通过对Web服务调用过程中各个环节及其相互关系进行深入分析,利用WSDL4J工具解析用户提供的WSDL文件,从中提取出所有服务操作及所使用数据类型的...
`oatpp`作为C++的框架,它旨在解决传统C++库在Web服务开发中的复杂性问题,提供一种现代且轻量级的解决方案。 **核心特性:** 1. **纯C++实现**:`oatpp`完全用C++编写,支持C++11及更高版本,这使得它可以充分利用...
**DWR(Direct Web Remoting)集合Spring实现异步提交** DWR(Direct Web Remoting)是一种开源JavaScript库,它允许Web应用程序在客户端与服务器之间进行实时、双向通信,从而实现异步数据交换。结合Spring框架,...
在本项目"基于DWR框架的Web推送技术实现"中,我们将探讨如何利用DWR框架来构建一个实时的Web聊天程序。 首先,理解DWR框架的核心概念是至关重要的。DWR允许开发者在浏览器中直接调用服务器上的Java方法,就像它们是...
在众多的Web开发框架中,PHP Web框架以其开源、易学、高效的特点备受青睐。本文将深入探讨PHP Web框架以及以“Laravel”为例的具体应用。 PHP Web框架的核心理念在于提供一套标准和规则,帮助开发者快速地搭建Web...
在SSM框架中实现模糊查询,主要涉及到以下几个关键知识点: 1. **Spring框架**:Spring作为基础框架,负责管理整个应用的bean,包括数据库操作类(如MyBatis的SqlSessionTemplate或Mapper接口)和业务逻辑层...
标题中的“EF+MVC+增删改查+webapi+异步上传文件+类库大全”涵盖了多个关键的IT技术领域,以下是这些技术的详细解释: 1. Entity Framework (EF):这是一个由Microsoft开发的对象关系映射(ORM)框架,用于.NET应用...
开源WEB框架-Portal-Basic使用手册的知识点可以详细阐述如下: 1. 开源WEB框架-Portal-Basic简介: Portal-Basic是Java Web应用开发框架,它提供了一套完整的高性能Full-Stack Web应用开发解决方案。其特点包括内置...
在Android开发中,调用Web服务是常见的需求,特别是与后端进行数据交互时。"Android异步封装调用Webservice"是指将调用Web服务的过程进行封装,使其能够在后台线程执行,避免阻塞主线程,提升用户体验。C# ...
通过内置的AJAX库,开发者可以轻松实现页面异步更新,从而创建出更流畅、更动态的Web应用。同时,它还提供了数据绑定机制,让开发者可以无缝地将服务器端数据与前端展示结合,简化了前后端的数据交互流程。 对于...
在这个"基于Hibernate/DWR框架实现的Web项目"中,我们可以看到开发者利用了Java Web开发的强大工具,包括Hibernate作为持久层框架,Direct Web Remoting (DWR)作为前端与后端交互的桥梁,以及Oracle数据库作为数据...
WorkerDOM 是一个JavaScript库,它的主要目标是将DOM API和框架功能带入Web Worker环境。在Web Worker中执行DOM操作可以显著...随着Web技术的不断发展,WorkerDOM这样的解决方案将会在未来的Web开发中发挥更大的作用。