定时(每隔数十毫米)执行有哪些方法

IdleMan 发布于 2012/06/25 22:26
阅读 314
收藏 0

我需要一个定时器。

需求条件:

1.间隔时间为毫秒级

2.运行稳定

3.资源占用少

 

除了timer还有什么方法可以实现?

加载中
0
hunterli
hunterli
1.间隔时间为毫秒级

这个得看操作系统的时间片吧?

如果你间隔定为10毫秒,但操作系统的时间片是16毫秒,貌似就不准确了。

中山野鬼
中山野鬼
这个可调,看是否值得调。严格的时间同步,又时意义不大。
0
乌龟壳
乌龟壳
sleep塞住指定毫秒。
乌龟壳
乌龟壳
sleep会把程序挂起,所谓挂起就是让线程休眠,所谓休眠就是让操作系统暂时不理会这个线程,这段休眠的时间CPU基本上认为没有这个线程存在。
IdleMan
IdleMan
频繁sleep不知道资源开销如何啊
0
IdleMan
IdleMan
突然想通了,我不需要定时器了,有个notify就可以了。谢谢LS兄弟
0
canghailan
canghailan
ScheduledExecutorService
0
中山野鬼
中山野鬼
#define GET_CPU_CLK(re) do { \
     unsigned int __a,__d; \
     __asm__ __volatile__("rdtsc" : "=a" (__a), "=d" (__d)); \
     (re) = ((unsigned long)__a) | (((unsigned long)__d)<<32); \
} while(0)
#define CPU_CLK_START() GET_CPU_CLK(s_last_count)
#define CPU_CLK_END(re) do{GET_CPU_CLK(re); (re) =(re) - s_last_count;	}while(0)
#define CPU_CLK_2_TIME(re,mode) do{\
	const long MODE_CLK[2] = {1000,1000000};\
		CPU_CLK_START();\
		sleep(1);\
		CPU_CLK_END(s_last_count);\
		re = (re * MODE_CLK[((mode) != 0)]) /  s_last_count;\
	}while(0)
static unsigned long long  s_last_count = 0;

你把这段放到头文件里。记得验证下unsigned long long 是64位的。同时上面的汇编针对GCC有效。

使用方法是:

unsigned long long _clk;
unsigned long long _total_clk;
void test(void){
   ...
}

void main_test(void){
    int i;
    for (i = 0 ; i < 10 ; i++){
       CPU_CLK_START();
       test();
       CPU_CLK_END(_clk);
       _total_clk += _clk;
    }
    CPU_CLK_2_TIME(_total_clk,1); // count us; if count ms , used CPU_CLK_2_TIME(var,0);
 printf("total times is %lld(us)!\n",_total_clk);
}

以上,可以稳定精确到微妙级。

0
IdleMan
IdleMan

谢谢LS各位的回答。现在说下我为什么需要定时器后来却选择了notify。

最近看到Oracle的缓存管理,遂联想到web的缓存,以前做asp.net开发,System.web.cache的失效可以是基于时间(相对时间、绝对时间)、也可以基于缓存依赖(文件或对象),于是乎自己想搞一个类似Oracle的缓存对象(lru算法,把常用的保留了,把不常用的进行清理,可以支持手动清理,可设置缓存容量)。就在想用什么方法可以对缓存中的对象进行每隔一段时间的扫描呢,首先想到的是定时器。C#的Timer和Thread以前也用过不少,印象不好,也就求组问各位还有什么方法实现定时器。

突然又想,我为什么需要定时器呢,为什么不在添加或者移除对象时进行扫描呢(Oracle的缓存就是在寻找新的缓存空间时进行扫描的,把不常用的对象移除缓存)。这就想到了notify,这东西是个好东西啊,比thread.sleep好用多了。

最后到google搜索“java  缓存”,泪流满面,扫描memcache、oscached一大堆基于lru算法的缓存框架,人家早就有这些想法并实现了。

返回顶部
顶部