关于Object.wait(long t)的问题,请指教 Thread.sleep(1000);按照楼主的想法这句应该改成Thread.currentThread().sleep(1000); 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 程序并不是按照你想的方式运行!main线程和你产生的线程是轮流共享cpu,它们何时该谁运行并不知道,不可能是你想的那样输出再1000左右! 这个可能和实际环境有关你要注意,在调用start时,JVM启动一个新的线程,但是这个是需要花费时间的,所以到进入run方法已经过了好一会儿了 楼上说的不太对吧,启动线程的时间可以忽略的。而且我用的是wait(1)在一个毫秒内肯定能轮到该线程占用cpu的。每次运行这个程序都是输出64,不太像是随机的。 我的机器上执行了多次,大概在7xx--9xx另外,有一点要改volatile boolean flag = true;========这个就不用解释了吧另外,考虑到线程启动需要时间,需要中其它指令的时间,8xx-9xx比较正常. 果然改为volatile boolean 输出就有500多了 另外,考虑到线程启动需要时间,需要中其它指令的时间,8xx-9xx比较正常 ==== 循环 一。系统中的时钟是不可能十分准确的呵呵 这个归功于 当时ibm设计pc的时候的计时方式,即时钟中断。这个中断每秒大约产生18次(55ms一次).DOS以后的操作系统吧他继承下来了。二。你的程序执行的时候也占用了一定的时间,而且windows系统是一个多线程的抢占式系统。这会使你的程序不会完全占用系统的cpu也就无法准确的计数。 import java.util.*;class Task extends TimerTask { int a = 0; public void run() { a++; } public int getCnt() { return a; }}public class Test { public static void main(String[] args) throws Exception { Timer tm = new Timer(); Task tsk = new Task(); tm.scheduleAtFixedRate(tsk, 0, 1); Thread.sleep(1000); tm.cancel(); System.out.println(tsk.getCnt()); }}用Timer类实现计时就可以输出1001,都是用Object.wait(long t)来实现的,类库实现者就是强啊。而且Timer sched函数代码比我的多很多,附加的时间因该更多呀,不知道为什么他们能做到如此的“实时性”。 楼上 不要忘了 java系统的底层 是用c实现的 不是的,Timer类是完全用java代码实现的,我看过没有用native 方法的。 Timer类是做了一个任务队列来pooling的, 队列采用wait/notify, 我想这比wait(1)更准确. 我还没完全看懂Timer 的代码,我发现这个类的代码不多, 多花点时间应该能看懂^_^ Object o = new Object(); long start = 0; start = System.currentTimeMillis(); synchronized (o) { for (int i = 0; i < 1000; ++i) { o.wait(1); } } System.out.println(System.currentTimeMillis() - start);以我本机为例:大概耗时 1090ms, 所以wait(1)的时间大概1.09ms那么1000/1.09=917 和我运行第一个程序的值非常接近. 使用GridBagLayout的问题-调整组建的大小 静态工厂方法 苦求,一個關於SQL的問題! 急问:::10分: java命令行中-D定义的属性值中带空格如何处理? 如何提高java編程能力 谁能帮帮我???????????????? 超级简单的问题………… 求高手点拨一个“输出与预期不符”的Java开发代码问题.. java算法题目 怎么求数组中,加和最大的两个数 JAVA 数据库 问题?? (高分简单)关于java中的char类型
main线程和你产生的线程是轮流共享cpu,它们何时该谁运行并不知道,不可能是你想的那样输出再1000左右!
你要注意,在调用start时,JVM启动一个新的线程,但是这个是需要花费时间的,所以到进入run方法已经过了好一会儿了
wait(1)在一个毫秒内肯定能轮到该线程占用cpu的。
每次运行这个程序都是输出64,不太像是随机的。
volatile boolean flag = true;
========
这个就不用解释了吧另外,考虑到线程启动需要时间,需要中其它指令的时间,8xx-9xx比较正常.
====
循环
呵呵 这个归功于 当时ibm设计pc的时候的计时方式,即时钟中断。这个中断每秒大约产生18次(55ms一次).
DOS以后的操作系统吧他继承下来了。
二。你的程序执行的时候也占用了一定的时间,而且windows系统是一个多线程的抢占式系统。这会使你的程序不会完全占用系统的cpu也就无法准确的计数。
int a = 0;
public void run() {
a++;
}
public int getCnt() {
return a;
}
}public class Test {
public static void main(String[] args) throws Exception {
Timer tm = new Timer();
Task tsk = new Task();
tm.scheduleAtFixedRate(tsk, 0, 1);
Thread.sleep(1000);
tm.cancel();
System.out.println(tsk.getCnt());
}
}用Timer类实现计时就可以输出1001,都是用Object.wait(long t)来实现的,类库实现者就是
强啊。而且Timer sched函数代码比我的多很多,附加的时间因该更多呀,不知道为什么他们能做
到如此的“实时性”。
我想这比wait(1)更准确.
long start = 0;
start = System.currentTimeMillis();
synchronized (o) {
for (int i = 0; i < 1000; ++i) {
o.wait(1);
}
}
System.out.println(System.currentTimeMillis() - start);以我本机为例:
大概耗时 1090ms, 所以wait(1)的时间大概1.09ms
那么1000/1.09=917
和我运行第一个程序的值非常接近.