一个多线程的问题
问?:
现在有A和B两个定时任务类, 还有一个业务类C, A每隔10分钟调用一次C执行业务, 同时B每天凌晨0点也会调用C执行业务, C类里有一个标志hasFinished用来判断一次任务是否执行完毕,比如
private boolean hasFinished = true;
public void doBiz(){
if(hasFinished==true){
//开始执行任务
hasFinished = false;
//执行业务
......
//任务结束
hasFinished = true;
}
}
由于A一直在调用C的doBiz(),所以如果B在每天凌晨0点调用C的doBiz时,A的调用还没结束,也就是说hasFinished还是false,这样B就不会执行doBiz()里的业务了,请问怎么样在B里做判断,如果C的hasFinished=false就一直等待,直到hashFinish=true了就马上唤醒B执行doBiz()??不知这样说大家是否能看懂- -!
private boolean hasFinished = true;
public void doBiz(){
if(hasFinished==true){
//开始执行任务
hasFinished = false;
//执行业务
......
//任务结束
hasFinished = true;
}
}
由于A一直在调用C的doBiz(),所以如果B在每天凌晨0点调用C的doBiz时,A的调用还没结束,也就是说hasFinished还是false,这样B就不会执行doBiz()里的业务了,请问怎么样在B里做判断,如果C的hasFinished=false就一直等待,直到hashFinish=true了就马上唤醒B执行doBiz()??不知这样说大家是否能看懂- -!
答!: 1:
好抽象,有难度,帮楼主顶了!我刚线程入门,学习中……
答!: 2:
还要做什么判断啊
楼主不是已经想好了吗
楼主不是已经想好了吗
答!: 3:
B的判断
while(!hasFinished)
{
wait();
}
while(!hasFinished)
{
wait();
}
答!: 4:
忘记说了,我昨天今天刚研究一个多线程例题
这个贴子
http://community.csdn.net/Expert/topic/4990/4990314.xml?temp=.9157373
你可以看看大侠们的说的
你可以给方法C加个锁啊!
这个关键字,synchronized,你找找,可以实现你说的
这个贴子
http://community.csdn.net/Expert/topic/4990/4990314.xml?temp=.9157373
你可以看看大侠们的说的
你可以给方法C加个锁啊!
这个关键字,synchronized,你找找,可以实现你说的
答!: 5:
加锁应该是个可行的方法
答!: 6:
因为方法C比较庞大, 可能执行的时间比较长, 我担心的是在方法上加了synchronized之后会导致线程阻塞,所以在C用hasFinished来判断,这样大不了这次不执行下次再执行,也不会阻塞
答!: 7:
用个监视器啊
具体自己做 睡觉去了 困呢
具体自己做 睡觉去了 困呢
答!: 8:
up 2 u
答!: 9:
有没有这么麻烦?
不需要B,直接在A里对凌晨0点作个判断就是了
不需要B,直接在A里对凌晨0点作个判断就是了
答!: 10:
把b放到a里,a在0点时判断是否运行完毕,运行完就执行b,另外应该再加一个b运行完毕的标识,以免多次执行b
答!: 11:
Timer TimerTask
答!: 12:
这样应该可以:
private boolean hasFinished = true;
private int[] lock = new int[0];
public void doBiz(){
while(!hasFinished){
synchronized(lock){
lock.wait();
}
}
if(hasFinished==true){
//开始执行任务
hasFinished = false;
//执行业务
......
//任务结束
hasFinished = true;
synchronized(lock){
lock.notify();
}
}
}
private boolean hasFinished = true;
private int[] lock = new int[0];
public void doBiz(){
while(!hasFinished){
synchronized(lock){
lock.wait();
}
}
if(hasFinished==true){
//开始执行任务
hasFinished = false;
//执行业务
......
//任务结束
hasFinished = true;
synchronized(lock){
lock.notify();
}
}
}
相关JAVA教程:
newDialog为什么传递不了数据!SOS!
想利用MVC模式实现一个小程序,遇到了麻烦,高手帮忙看下。在线等
interface 和 Object 的问题
[说难不难的问题]:__FUNCTION__是c++中表示当前函数名的宏,java中又如何 获取当前类和方法 ?
String格式的问题
js 怎样获得td里的值?
关于嵌套类
如何覆盖的写文件?
checkbox 提交问题?
能否有-------非堵塞---------socket
大家好,小弟想学习JAVA,但却苦于不知从何学起,望大家给与指点迷精?3Q
关于java术语的中文名称