异步解决方案中除了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();
}
}
分享到:
相关推荐
方案是为解决特定问题或达成特定目标而制定的一系列计划或步骤。它的作用是提供一种系统性的...总体而言,方案的作用在于提供一种有序、有计划的方法,以解决问题、实现目标,并在实施过程中最大化资源利用和风险管理。
它可以用作Express的默认路由器以及其他基于中间件的框架的替代产品。 需要节点8+支持异步/等待,或类似东西。快速示例(表达) var app = require ( 'express' ) ( ) , router = require ( 'node-async-router' ) ...
Cookbook功能亮点轻巧,坚固且Roa Roa是一个异步Web框架,其灵感来自轻巧但功能强大的koajs。 例子 指南| Cookbook功能亮点轻巧,坚固且可扩展的核心。 支持HTTP / 1.x和HTTP / 2.0协议。 完整流式传输。 高度可扩展...
针对使用低版本浏览器的用户因安全策略导致无法上传文件的问题,采用一种基于Iframe的内联框架的解决方案能够实现异步文件上传、删除等功能。用这种方式上传图片、音视频等多媒体文件时,能在不跳转页面情况下看到所...
搭建本地服务器和web前台网站,Ajax用于服务端与客户端之间异步通信;前端基于HTML、CSS、 JS、JSP、jQuery实现用户界面;搭建、设计MySQL数据库;后端使用Java语言实现学生注册、学生登陆、查看个人信息、打印准考...
Roa是一个异步网络框架,其灵感来自轻巧但功能强大的koajs。 : | | 功能亮点 轻巧,坚固且可扩展的核心。 支持HTTP / 1.x和HTTP / 2.0协议。 全流。 高度可扩展的中间件系统。 基于 (独立于运行时),您可以...
面对日益复杂的Web应用系统和变更频繁的用户需求,企业需要从纷繁复杂的开发框架中选出一套可行的解决方案以保持高效保质的开发工作,为此,本文采用J2EE分层架构思想构建了一个面向Web应用系统快速开发的开发平台,...
我们将使用ASP.NET MVC框架和C#编程语言来实现这个项目。 ASP.NET MVC是一种成熟的开发框架,它采用模型-视图-控制器的设计模式,将应用程序的逻辑和界面分离,提供了更好的代码组织和可维护性。我们选择ASP.NET MVC...
我们将使用ASP.NET MVC框架和C#编程语言来实现这个项目。 ASP.NET MVC是一种成熟的开发框架,它采用模型-视图-控制器的设计模式,将应用程序的逻辑和界面分离,提供了更好的代码组织和可维护性。我们选择ASP.NET MVC...
我们将使用ASP.NET MVC框架和C#编程语言来实现这个项目。 ASP.NET MVC是一种成熟的开发框架,它采用模型-视图-控制器的设计模式,将应用程序的逻辑和界面分离,提供了更好的代码组织和可维护性。我们选择ASP.NET MVC...
我们将使用ASP.NET MVC框架和C#编程语言来实现这个项目。 ASP.NET MVC是一种成熟的开发框架,它采用模型-视图-控制器的设计模式,将应用程序的逻辑和界面分离,提供了更好的代码组织和可维护性。我们选择ASP.NET MVC...
我们将使用ASP.NET MVC框架和C#编程语言来实现这个项目。 ASP.NET MVC是一种成熟的开发框架,它采用模型-视图-控制器的设计模式,将应用程序的逻辑和界面分离,提供了更好的代码组织和可维护性。我们选择ASP.NET MVC...
我们将使用ASP.NET MVC框架和C#编程语言来实现这个项目。 ASP.NET MVC是一种成熟的开发框架,它采用模型-视图-控制器的设计模式,将应用程序的逻辑和界面分离,提供了更好的代码组织和可维护性。我们选择ASP.NET MVC...
我们将使用ASP.NET MVC框架和C#编程语言来实现这个项目。 ASP.NET MVC是一种成熟的开发框架,它采用模型-视图-控制器的设计模式,将应用程序的逻辑和界面分离,提供了更好的代码组织和可维护性。我们选择ASP.NET MVC...
我们将使用ASP.NET MVC框架和C#编程语言来实现这个项目。 ASP.NET MVC是一种成熟的开发框架,它采用模型-视图-控制器的设计模式,将应用程序的逻辑和界面分离,提供了更好的代码组织和可维护性。我们选择ASP.NET MVC...
我们将使用ASP.NET MVC框架和C#编程语言来实现这个项目。 ASP.NET MVC是一种成熟的开发框架,它采用模型-视图-控制器的设计模式,将应用程序的逻辑和界面分离,提供了更好的代码组织和可维护性。我们选择ASP.NET MVC...
我们将使用ASP.NET MVC框架和C#编程语言来实现这个项目。 ASP.NET MVC是一种成熟的开发框架,它采用模型-视图-控制器的设计模式,将应用程序的逻辑和界面分离,提供了更好的代码组织和可维护性。我们选择ASP.NET MVC...
本文介绍了Ajax技术的原理及特点,并对采用STRUTS框架的Web应用中如何使用Ajax技术,通过异步数据交互的方式实现文本框输入渐进提示功能的方法进行了说明
系统基于业内主流WEB框架LAMP进行应用的开发(LAMP框架具有Web资源丰富、轻量、快速开发等特点) 软件系统整体设计方案全文共25页,当前为第9页。 系统WEB前端使用主流的模块加载框架SeaJS,轻量级的js库JQuery, ...
基于C ++ 14/17的HTTP应用程序框架drogon,Drogon可用于使用C ++轻松构建各种类型的Web应用程序服务器程序。 Drogon是一个跨平台框架,它支持Linux,macOS,FreeBSD和Windows。其主要特点如下: *使用基于epoll的非...