java 连android设备执行adb命令中断返回流阻塞_java 如何调用方法里超过10秒就终止该方法,不往下执行,防止线程阻塞...

满意答案

02ae427d08e371d7e90d5b995e828d6d.png

homewellhhx

2014.01.01

02ae427d08e371d7e90d5b995e828d6d.png

采纳率:58%    等级:13

已帮助:8827人

本来用DWR调用方法就是多线程的,线程总数与J2EE容器配置的有关。

建议如下:

如果你这个A()调用的接口一次只允许一个访问,那么需要在A所在的类里设置一个静态成员变量,如static String object = "some"。

然后在A()方法一开始用synchronized (object) {.. }把代码都包含进来。

这样可以确保一次只有一个访问。

如果接口一次最多运行固定数目的访问,如10个。那么复杂一些,不过我估计你不是这个情况。一般建议这个固定数目与J2EE容器配置的线程数一致即可。

上述方法都是为了防止接口被同时访问,但这样的后果就是前端用户会等待,甚至线程满。前端等待是没办法的,后面慢,前面只有排队了。线程满的话,最好的方式是采用非阻塞的IO(NIO),不过那个很难做到。你提出的10秒终止方法是一种方案,不过关键在于如何终止一个方法的运行。

很遗憾,Java不能任意终止一个方法的运行,不过对于接口操作,可以如下处理:

a) 如果接口是TCP/IP,那么可以通过强行关闭socket来终止。如:

timer.schedule( new TimerTask() {

public void run() {

socket.close();

}

}, 10000);

b) 如果接口是用类库的话,看看它有没有设置timeout的地方,如果有,那么设置一下,如果没有,那么没办法了。

补充:

你用了axis的setTimeout,理论上超过10秒后call.invoke会抛出异常的。

假设后台很慢,每次都需要10秒,假设weblogic线程池大小为50,那么如果同时访问的人超过50个,或者每秒访问量超过5个,那么就会发生线程阻塞。

这是系统性能问题,可以将weblogic的线程池最大数量设置高些来增加吞吐量。不过这种方式治标不治本,如果你的程序预计到并发访问量很大,那么后台响应超过1秒就不太合理了,这个改动起来就很麻烦了。

00分享举报

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值