多线程访问

java_2008_4_4 2008-09-28 09:20:05
在一个WEB工程中使用了 struts
现在有这么一个要求: 某个 Action 中的一段代码要在一个特定的时间(该特定时间是可以设置的)只执行一次.该段代码以外的代码每次都要执行.且该 Action 是被高并发访问的.所以我不能使用 :

synchronized (this) {
...
}

来进行同步.如果这样做了必然回导至访问的排队现象.
同时也不能使用 Timer (项目要求).
请问各位高手能否赐教一良策!
先谢谢了
...全文
200 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanglei0730 2008-09-28
  • 打赏
  • 举报
回复
关注中。。。
zhou02607 2008-09-28
  • 打赏
  • 举报
回复
这是我写的测试代码,可以用的。


import java.util.Date;
class Knowing{
public static Boolean i = true;
public void start(){
test t1=new test("t1");
test t2=new test("t2");
test t3=new test("t3");
timer ti=new timer();
t1.start();
t2.start();
t3.start();
ti.start();
}
public static void main(String[] args){
Knowing k=new Knowing();
k.start();
}

class test extends Thread{
String name="";
public test(String name){
this.name=name;
}
public void run(){
while(true){
synchronized (i){
if(i){
System.out.println(name+":Hello!"+new Date(System.currentTimeMillis()).toLocaleString());
i=false;
}
}
}
}
}
class timer extends Thread{
int count=0;
public synchronized void run(){
while(true){
try {
Thread.sleep(1000);
count++;
if(count==2){
i = true;
count=0;
}
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}
}
}

zhou02607 2008-09-28
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 java_2008_4_4 的回复:]
引用 18 楼 zhou02607 的回复:
不是,action里面只要放如下代码:

Java code
if(synchronizedBool){
//Sing1
synchronizedBool = false;
..//执行逻辑
}


在另外一个后台线程内控制一个变量:

Java code
class myThread extends Thread{
static boolean synchronizedBool= true;
public void run(){
//判断时间点并设施synchronizedBool值
}
}


如果一个线程…
[/Quote]

是的,忘记加一句了。synchronizedBool为一个Boolean对象。

synchronized(synchronizedBool){
if(synchronizedBool){
//Sing1
synchronizedBool = false;
..//执行逻辑
}
}

rainsilence 2008-09-28
  • 打赏
  • 举报
回复

public class BaseAction extends DispatchAction {

private SpecialOption option = new SpecialOption();

public ActionForward update(ActionMap map, ActionForm form, ServletHttpRequest request, ServletHttpResponse response){

}

public ActionForward add(ActionMap map, ActionForm form, ServletHttpRequest request, ServletHttpResponse response){
synchronized (option) {// 同步option对象,而不是整个Action
option.****方法
}
}

public ActionForward delete(ActionMap map, ActionForm form, ServletHttpRequest request, ServletHttpResponse response){

}

}

// 特殊功能类
public class SpecialOption() {

}


或者你单独使用DispatchAction,把调用的方法单独独立出来,等到了时间直接调用那个方法
hf_0002007 2008-09-28
  • 打赏
  • 举报
回复
为什么不将这段 特殊的代码以出来 ,做为一个Thread 在那边定时的跑呢
java_2008_4_4 2008-09-28
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zhou02607 的回复:]
不是,action里面只要放如下代码:

Java code
if(synchronizedBool){
//Sing1
synchronizedBool = false;
..//执行逻辑
}




在另外一个后台线程内控制一个变量:

Java code
class myThread extends Thread{
static boolean synchronizedBool= true;
public void run(){
//判断时间点并设施synchronizedBool值
}
}
[/Quote]

如果一个线程执行到 Sing1 处.该其它线程执行了!将又会导致.....
ZXEOC 2008-09-28
  • 打赏
  • 举报
回复
然后在Action里把代码改成调用这个方法就行了
ZXEOC 2008-09-28
  • 打赏
  • 举报
回复

void fun()
{
if(/*currentTime>=executeTime*/ && executedFlagBool==false)
{
//insert your operation here
executedFlagBool=true;
}
else if(/*currentTime>=resetTime*/)
executedFlagBool=false;
return;
}
zhou02607 2008-09-28
  • 打赏
  • 举报
回复
为什么?
java_2008_4_4 2008-09-28
  • 打赏
  • 举报
回复
这样不行哥们!
zhou02607 2008-09-28
  • 打赏
  • 举报
回复
当然那个synchronizedBool变量放在何处应该可以自定。
zhou02607 2008-09-28
  • 打赏
  • 举报
回复
不是,action里面只要放如下代码:

if(synchronizedBool){
synchronizedBool = false;
..//执行逻辑
}


在另外一个后台线程内控制一个变量:

class myThread extends Thread{
static boolean synchronizedBool= true;
public void run(){
//判断时间点并设施synchronizedBool值
}
}
java_2008_4_4 2008-09-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 zhou02607 的回复:]
那每次执行该段代码时判断是否可执行,判断可以根据某个变量来判断,该变量可以是一个boolean类型的值(该变量设为synchronized),true的时候可运行,运行完后设为false。运行一个后台线程,该后台线程每秒检测当前时间是否是时间点,若是则设置那个boolean值为true。
[/Quote]

还是要使用 synchronized 方法啊!
你的意思是:

synchronized (this) {
if(synchronizedBool){//synchronizedBool 为你所说的判断条件
synchronizedBool = false;
if(nowIsExcuteTime){//判断是否到了执行时间
...//执行逻辑
}
}
synchronizedBool = true;
}

zhou02607 2008-09-28
  • 打赏
  • 举报
回复
那每次执行该段代码时判断是否可执行,判断可以根据某个变量来判断,该变量可以是一个boolean类型的值(该变量设为synchronized),true的时候可运行,运行完后设为false。运行一个后台线程,该后台线程每秒检测当前时间是否是时间点,若是则设置那个boolean值为true。
java_2008_4_4 2008-09-28
  • 打赏
  • 举报
回复
理解出来了!有对策么?
java_2008_4_4 2008-09-28
  • 打赏
  • 举报
回复
zhou02607 2008-09-28
  • 打赏
  • 举报
回复
我的理解是一天只能执行一次,以这个特定时间点为分割点,在特定时间点内第一次调用此action时执行该代码,是不是?
zhou02607 2008-09-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 java_2008_4_4 的回复:]
引用 9 楼 zhou02607 的回复:

代码是放在action里的,要是在10:30 分 0秒 0毫秒这个action没有被调用怎么办?


如果访问的当前时间大于 10:30 分 0秒 0毫秒 且该代码没有执行过.就会执行该代码.但也执行一次!
[/Quote]

这个时间点问题还是没搞清楚。如果今天的10:30 分 0秒 0毫秒没有执行,那接下来再执行也只会执行一次,那明天的10:30 分 0秒 0毫秒之前能执行几次?
Hibernaters 2008-09-28
  • 打赏
  • 举报
回复
看来你特定的这段代码和Action中其他的业务没什么具体关联
既然要在一天特定时间跑一次(或几次),不用把代码放在Action中吧,写一个脚本,每天定时跑就好了
java_2008_4_4 2008-09-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhou02607 的回复:]

代码是放在action里的,要是在10:30 分 0秒 0毫秒这个action没有被调用怎么办?
[/Quote]

如果访问的当前时间大于 10:30 分 0秒 0毫秒 且该代码没有执行过.就会执行该代码.但也执行一次!
加载更多回复(10)

62,616

社区成员

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

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