java如何在指定时间内循环查询

wgd81685 2012-12-19 06:07:56
我有一个check()方法,返回值是boolean值
如何在两秒钟之内反复执行check()方法,并且一旦check()方法返回为true,就停止此查询;
两秒之后也若check()方法还是返回为false,也停止查询
...全文
354 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wgd81685 2012-12-21
  • 打赏
  • 举报
回复
谢谢大家.下面是我参照大家的建议写的代码,基本上能实现我的要求,但是我总觉得会影响性能,大家帮忙看下有没有可以改进的地方.
public class TestRun {

    private boolean stx;
    private Thread t1;
    private Thread t2;

    public void test() {
        t1 = new ReadThread();
        t2 = new WriteThread();
        t1.start();
        t2.start();
    }

    class ReadThread extends Thread {
        public void run() {
            long temp = System.currentTimeMillis();
            while (!stx) {
                if (System.currentTimeMillis() - temp >= 2000) {
                    break;
                }
            }
            System.out.println("stx=" + stx);
        }
    }

    class WriteThread extends Thread {
        public void run() {
            Random rm = new Random();
            while(true){
                if(rm.nextInt()%5==0){
                    stx=true;
                }
            }
        }
    }
}
gukuitian 2012-12-21
  • 打赏
  • 举报
回复
引用 8 楼 wgd81685 的回复:
引用 7 楼 abstruct 的回复:主要在于你要在返回true的时候就退出了所以你可以对前面的代码修改一下 Thread.sleep(2000);执行一次休息两秒,这个应该没问题的。最好不好2秒去执行一次,那样的话可能会上次的还没返回这次又去check了 谢谢.因为我写的代码是多线程的,有另外一个线程在对check()方法的返回值不断的更改,我这边的业务逻辑是一旦……
按你这么说,你这个两秒检查的条件就不能用了。或者加快检查的频率,或者考虑线程间通信吧。
安特矮油 2012-12-21
  • 打赏
  • 举报
回复
例子:不知道这样能不能满足你的要求

package com.study.thread;

public class ThreadSleep {

	public static void main(String[] args) {
		Thread t1 = new T1();
		Thread t2 = new T2(t1);
		t1.start();
		t2.start();
	}
}

class T1 extends Thread{
	public void run(){
		while(true){
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				System.out.println("线程被中断信号唤醒");
				break;
			}
		}
		System.out.println("等待check信号的线程结束");
	}
}

class T2 extends Thread{
	
	private Thread t;
	
	public T2(Thread t){
		this.t = t;
	}
	
	public void run(){
		Method m = new Method();
		for(int i = 0; ;i++){
			if(m.check(i)){
				t.interrupt();
				break;
			}
		}
	}
}

class Method{
	public boolean check(int i){
		System.out.println("执行check方法.....");
		if(i >= 10){
			return true;
		}else{
			return false;
		}
	}
}
安特矮油 2012-12-21
  • 打赏
  • 举报
回复
等待check状态的线程在等待check状态的时候sleep,等到另一个线程返回了check状态的时候马上去中断他的sleep让他继续往下执行。
wgd81685 2012-12-21
  • 打赏
  • 举报
回复
引用 5 楼 q2979978 的回复:
不停的调用不太合理吧,可以设置成比如100ms判断一次,参考Timer和TimerTask类
用Timer和TimerTask如何保证两秒之后退出呢?
wgd81685 2012-12-21
  • 打赏
  • 举报
回复
引用 6 楼 luckyc2008 的回复:
不能用==吧,假如执行一次的时间大于2秒,那是死循化啦,而且执行一次的时间不好判断,有时慢,有时快啊。
明白,用>=更好
wgd81685 2012-12-21
  • 打赏
  • 举报
回复
引用 7 楼 abstruct 的回复:
主要在于你要在返回true的时候就退出了所以你可以对前面的代码修改一下 Thread.sleep(2000);执行一次休息两秒,这个应该没问题的。最好不好2秒去执行一次,那样的话可能会上次的还没返回这次又去check了
谢谢.因为我写的代码是多线程的,有另外一个线程在对check()方法的返回值不断的更改,我这边的业务逻辑是一旦check()方法返回true,马上停止查询,如果用Thread.sleep(2000)的话,必须2秒之后才能再次查询,这样没法满足业务逻辑的要求
gukuitian 2012-12-21
  • 打赏
  • 举报
回复
引用 14 楼 wgd81685 的回复:
谢谢大家.下面是我参照大家的建议写的代码,基本上能实现我的要求,但是我总觉得会影响性能,大家帮忙看下有没有可以改进的地方. Java code?123456789101112131415161718192021222324252627282930313233343536public class TestRun { private boolean stx; ……
你这程序跑起来,cpu使用率不得疯涨啊。
wgd81685 2012-12-21
  • 打赏
  • 举报
回复
引用 15 楼 q2979978 的回复:
引用 10 楼 wgd81685 的回复:引用 5 楼 q2979978 的回复:不停的调用不太合理吧,可以设置成比如100ms判断一次,参考Timer和TimerTask类 用Timer和TimerTask如何保证两秒之后退出呢?定义一个时间变量记录当前所用的时间,到2s了之后就停止啊,TimerTask的cancel
谢谢,不过Time和TimerTask会开启新的线程,我这边需要在当前线程内做这个操作
jeff_jiang 2012-12-21
  • 打赏
  • 举报
回复
引用 10 楼 wgd81685 的回复:
引用 5 楼 q2979978 的回复:不停的调用不太合理吧,可以设置成比如100ms判断一次,参考Timer和TimerTask类 用Timer和TimerTask如何保证两秒之后退出呢?
定义一个时间变量记录当前所用的时间,到2s了之后就停止啊,TimerTask的cancel
安特矮油 2012-12-20
  • 打赏
  • 举报
回复
主要在于你要在返回true的时候就退出了所以你可以对前面的代码修改一下 Thread.sleep(2000);执行一次休息两秒,这个应该没问题的。最好不好2秒去执行一次,那样的话可能会上次的还没返回这次又去check了
luckyc2008 2012-12-20
  • 打赏
  • 举报
回复
不能用==吧,假如执行一次的时间大于2秒,那是死循化啦,而且执行一次的时间不好判断,有时慢,有时快啊。
jeff_jiang 2012-12-20
  • 打赏
  • 举报
回复
不停的调用不太合理吧,可以设置成比如100ms判断一次,参考Timer和TimerTask类
  • 打赏
  • 举报
回复
那就不知道了
wgd81685 2012-12-19
  • 打赏
  • 举报
回复
二楼的朋友,谢了.我想的就是你这个意思. 这个方法我也想到了,但心里觉的没底. java里有没有类似的已经封装好的更好的方法?
  • 打赏
  • 举报
回复
楼主看看是不这个意思
import java.util.Date;

public class Test2 {
	
	private static  long s = (new Date()).getTime();
	
	private static boolean check(){
		return false;
	}
	
	public static void main(String[] args) {
		while(!check()){
			if((new Date().getTime())==(s+2000)){
				/*
				 *这3个System是判断是不是2秒之后结束的循环 
				 */
//				System.out.println("now=="+s);
//				System.out.println(new Date(s));
//				System.out.println(new Date(s+2000));
				break;
			}
		}
	}
}
  • 打赏
  • 举报
回复
可以把方法贴出来吗?

62,614

社区成员

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

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