struts2的action怎样实现多线程?

GzLiotu 2014-09-08 10:42:32
struts2的action怎样实现多线程?为的是action中出发另外一个请求或者进程。而本页面直接返回,不需要等待action中数据的加载。本人多线程用得比较少,求具体一些的例子,谢谢大神!!!
...全文
533 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccqqct 2014-12-12
  • 打赏
  • 举报
回复
楼主是想问servelet3中的AsyncContext么?不过好象struts2的ActionContext.getContext()都是绑定线程的,一年多前试过,startAsync后strtus2自己返回了,但页面还是不会返回,直到complete,但struts2就不管这些数据了,而且异步执行的线程里取不到ActionContext,对了,我还是用nio请求第三方数据的,因为第三方返回慢,经常要几秒,甚至十秒都有,如果不用nio+servlet3就导致线程很多,这样只是连接多。当时为解决这些看struts2源码,写插件改好久。不知道现在的strust2有没有解决
GzLiotu 2014-09-09
  • 打赏
  • 举报
回复
知道是多线程的,为的是action中发出一个请求,而页面直接返回,不需要等待action中数据的加载。如果等action中所有要查询的数据加载完,那样速度就会很慢,所有想利用多线程,解决这个问题。。。
GzLiotu 2014-09-09
  • 打赏
  • 举报
回复
引用 13 楼 zy353003874 的回复:
其实线程池不见得比你的慢慢获取数据快多少
确实,效果不是太明显。
GzLiotu 2014-09-09
  • 打赏
  • 举报
回复
恩,意思就是这样
zy_think123 2014-09-09
  • 打赏
  • 举报
回复
其实线程池不见得比你的慢慢获取数据快多少
cxw3152 2014-09-09
  • 打赏
  • 举报
回复
struts1是单例模式。。所以是单线程的。。 struts2不是单例模式每个session单独共享一个线程 所以就是多线程的。
GzLiotu 2014-09-09
  • 打赏
  • 举报
回复
确实是异步,不过用Ajax,js过多不利于百度搜索引擎的抓取?
wu244534279 2014-09-09
  • 打赏
  • 举报
回复
按你的说法,你要实现的效果应该是异步,而不是多线程,看看ajax吧
济南大飞哥 2014-09-09
  • 打赏
  • 举报
回复
引用 11 楼 zhqqhao 的回复:
是用分页做了。页面用ajax无刷新实现数据加载,但是页面多显示js代码或是动态的填充层,这样不利于蜘蛛的抓取。改用了页面跳转的时候在action中加载数据,然后跳转至页面,不过这样速度比较慢,在action中加了一个线程池效果还是不太理想,怎么办???
你是用线程把所有数据都读取出来然后返回?
GzLiotu 2014-09-09
  • 打赏
  • 举报
回复
是用分页做了。页面用ajax无刷新实现数据加载,但是页面多显示js代码或是动态的填充层,这样不利于蜘蛛的抓取。改用了页面跳转的时候在action中加载数据,然后跳转至页面,不过这样速度比较慢,在action中加了一个线程池效果还是不太理想,怎么办???
济南大飞哥 2014-09-09
  • 打赏
  • 举报
回复
引用 9 楼 zhqqhao 的回复:
/* 多线程从多个接口获取查询数据 */ ExecutorService pool = Executors.newFixedThreadPool(1); //创建线程池 Callable<List> rmCallable = new RoadRunCallable(criteria,SqlConstants.GET_TRAVELS_LIST); Future<List> rmfuture = pool.submit(rmCallable); pool.shutdown(); //关闭线程池 public class RoadRunCallable implements Callable<List> { private PageQueryCriteria critria; private String statementName; public RoadRunCallable(PageQueryCriteria critria,String statementName){ this.critria = critria; this.statementName = statementName; } @Override public List call() throws Exception { Query query = (Query)ServiceLocator.getService("query"); return query.queryForList(statementName, critria); } }
为啥不用分页?
GzLiotu 2014-09-09
  • 打赏
  • 举报
回复
/* 多线程从多个接口获取查询数据 */ ExecutorService pool = Executors.newFixedThreadPool(1); //创建线程池 Callable<List> rmCallable = new RoadRunCallable(criteria,SqlConstants.GET_TRAVELS_LIST); Future<List> rmfuture = pool.submit(rmCallable); pool.shutdown(); //关闭线程池 public class RoadRunCallable implements Callable<List> { private PageQueryCriteria critria; private String statementName; public RoadRunCallable(PageQueryCriteria critria,String statementName){ this.critria = critria; this.statementName = statementName; } @Override public List call() throws Exception { Query query = (Query)ServiceLocator.getService("query"); return query.queryForList(statementName, critria); } }
济南大飞哥 2014-09-09
  • 打赏
  • 举报
回复
引用 6 楼 zhqqhao 的回复:
问题解决了,我在action中用到了线程池,解决页面跳转过慢的问题。
绝对是不好的实现,web编程不应该使用那么“底层”的方法,你应该使用ajax。
wangqiao4j 2014-09-09
  • 打赏
  • 举报
回复
引用 6 楼 zhqqhao 的回复:
问题解决了,我在action中用到了线程池,解决页面跳转过慢的问题。
楼主具体是怎么解决的,可以把源码发来看看么,我也想学习下,多谢。
GzLiotu 2014-09-09
  • 打赏
  • 举报
回复
问题解决了,我在action中用到了线程池,解决页面跳转过慢的问题。
火柴棍的坚强 2014-09-08
  • 打赏
  • 举报
回复
struts2的action本来就是多例的。。。。所以是多线程的
1 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;Struts 1的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能。Struts 2提供一个ActionSupport基类去实现常用的接口。即使Action接口不是必须实现的,只有一个包含execute方法的POJO类都可以用作Struts 2的Action。 2 线程模式方面的对比:Struts 1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts 1 Action能做的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。 3 Servlet依赖方面的对比:Struts 1 Action依赖于Servlet API,因为Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。Struts 2 Action不再依赖于Servlet API,从而允许Action脱离Web容器运行,从而降低了测试Action的难度。 当然,如果Action需要直接访问HttpServletRequest和HttpServletResponse参数,Struts 2 Action仍然可以访问它们。但是,大部分时候,Action都无需直接访问HttpServetRequest和HttpServletResponse,从而给开发者更多灵活的选择。 4 可测性方面的对比:测试Struts 1 Action的一个主要问题是execute方法依赖于Servlet API,这使得Action的测试要依赖于Web容器。为了脱离Web容器测试Struts 1的Action,必须借助于第三方扩展:Struts TestCase,该扩展下包含了系列的Mock对象(模拟了HttpServetRequest和HttpServletResponse对象),从而可以脱离Web容器测试Struts 1的Action类。Struts 2 Action可以通过初始化、设置属性、调用方法来测试。
主要对WEB框架常面试的点做了一下整理,希望可帮助到你,下面文档的部分内容 Java---SSH(MVC) 1. 谈谈你mvc的理解 MVC是Model—View—Controler的简称。即模型—视图—控制器。MVC是一种设计模式,它强制性的把应用程序的输入、处理和输出分开。 MVC中的模型、视图、控制器它们分别担负着不同的任务。 视图: 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。 模型: 模型表示业务数据和业务处理。相当于JavaBean。一个模型能为多个视图提供数据。这提高了应用程序的重用性 控制器: 当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求。 + 然后根据处理的结果调用相应的视图来显示处理的结果。 MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。 Struts 1. struts1.2和struts2.0的区别?如何控制两种框架中的单例模式? struts1.2和struts2.0的对比 a、Action类: struts1.2要求Action类继承一个基类。struts2.0 Action要求继承ActionSupport基类 b、线程模式 struts1.2 Action是单例模式的并且必须是线程安全的,因为仅有一个Action的实例来处理所有的请求。 单例策略限制了Struts1.2 Action能做的事情,并且开发时特别小心。Action资源必须是线程安全的或同步的。 struts2.0 Action为每一个请求产生一个实例,因此没有线程安全问题。 c、Servlet依赖 struts1.2 Action依赖于Servlet API,因为当一个Action被调用时HttpServletRequest和HttpServletResponse被传递给execut方法。 struts2.0 Action不依赖于容器,允许Action脱离容器单独测试。如果需要,Struts2 Action仍然可以访问初始的Request和Response。 但是,其他的元素减少或者消除了直接访问HttpServletRequest和HttpServletResponse的必要性。 d、可测性 测试struts1.2 Action的一个主要问题是execute方法暴露了Servlet API(这使得测试要依赖于容器)。一个第三方扩展:struts TestCase 提供了一套struts1.2的模拟对象来进行测试。 Struts2.0 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”也使得测试更容易。

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧