java 如何调用方法里超过10秒就终止该方法,不往下执行,防止线程阻塞

比如:jsp 通过dwr 调用方法 A() ,当A方法里面执行的时间超过10秒就终止该方法,为了防止线程阻塞

这个问题不难解决,解决的办法是:首先在调用方法 的前面设置开始执行调用的时间是什么时候,然后在方法的调用结束处再设置调用方法结束时是什么时候,再用结束时的时间减去开始时的时间,如果这个时间差大于十秒则使用break结束程序。部分代码如下(10秒等于10000毫秒):long startTime = System.currentTimeMillis();dwr.a();long endTime = System.currenTimeMillis();if(endTime - statreTime > 100000){break;}
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-06-04
本来用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秒就不太合理了,这个改动起来就很麻烦了。
第2个回答  2013-06-08
设置一个定时器,设为10秒,如果超过10秒,就break或者continue,就是你所谓的“终止”该方法。至于防止线程阻塞,可以用同步手段做到。关键字:syncronized
第3个回答  2013-06-08
java是跨平台的!而.net相对于java来说没有太大的优势!.net的代码一般都有提示!而java得没有

java 如何调用方法里超过10秒就终止该方法,不往下执行,防止线程阻塞
如果你这个A()调用的接口一次只允许一个访问,那么需要在A所在的类里设置一个静态成员变量,如static String object = "some"。然后在A()方法一开始用synchronized (object) 把代码都包含进来。这样可以确保一次只有一个访问。如果接口一次最多运行固定数目的访问,如10个。那么复杂一些,不过我估计你不...

java 如何调用方法里超过10秒就终止该方法,不往下执行,防止线程阻塞
本来用DWR调用方法就是多线程的,线程总数与J2EE容器配置的有关。建议如下:如果你这个A()调用的接口一次只允许一个访问,那么需要在A所在的类里设置一个静态成员变量,如static String object = "some"。然后在A()方法一开始用synchronized (object) {.. }把代码都包含进来。这样可以确保一次只有一个...

java 我调用某个方法 但我不等他结束 继续往下运行,这个方法怎么写 我...
};t.start();

如何关闭java线程
1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。2. 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。3. 使用interrupt方法中断线程。1. 使用退出标志终止线程 当run方法执行完后,线程就会退出。但有时run方法是永远不...

java中的阻塞式方法是什么意思,比如InputStream中的read()方法。
java中的阻塞式方法是指在程序调用改方法时,必须等待输入数据可用或者检测到输入结束或者抛出异常,否则程序会一直停留在该语句上,不会执行下面的语句。java中很多方法都是属于阻塞式方法,比如InputStream中的read()方法和多线程中sleep()方法等。

java 如何方法限定一个线程使用?
你可以通过synchronized关键字来限制一个方法只能在一个线程执行。你可以将该方法用synchronized关键字修饰,这样当一个线程在执行这个方法时,其他线程将会被阻塞,直到该线程执行完成,其他线程才能继续执行该方法。例如:public synchronized void myMethod(){ \/\/方法执行的代码 } 这里我们使用synchronized关键...

Java线程唤醒与阻塞常用方法有哪些
1. sleep() 方法 sleep(毫秒),指定以毫秒为单位的时间,使线程在该时间内进入线程阻塞状态,期间得不到cpu的时间片,等到时间过去了,线程重新进入可执行状态。(暂停线程,不会释放锁)2.suspend() 和 resume() 方法 挂起和唤醒线程,suspend e()使线程进入阻塞状态,只有对应的resume e()被调用...

java有三段代码,我想执行程序时候就直接执行第一段代码,然后隔5秒向 ...
总该有个main方法吧? 在main方法里调用fun1();之后再Thread.sleep(5000)然后下面调用fun2();再Thread.sleep(5000)最后再调用fun3();这样程序一开始就会先执行方法1,再停止5秒再执行方法2再停止5秒再执行方法3了

JVM是如何调用Java主类的main()方法的?
检查目标方法是否需要编译,如果配置了-Xint选项,则以解释模式执行,避免编译步骤。获取目标方法的解释模式入口,即entry_point,这是为Java方法调用准备的栈帧,并指向method的第一个字节码内存地址。调用call_stub()函数,需要传递参数包括link、result_val_address、result_type、method、entry_point、args...

Java中的finalize()方法
finalize()一般是用不到的,除非JVM认为已经没有内存可以使用了,那时JVM才会消耗资源去清理垃圾,所以finalize()也不能作为通用的清理方法。而且finalize()有一个比较另类的用法,就是说finalize()并不依赖对它的直接调用,它有某些触发机制,比如说对象已经标明要被终结,这时会自动执行finalize()。并不...

相似回答