Java Thread.sleep()无法正常工作,为什么?

Java Thread.sleep()无法正常工作,为什么?,java,Java,下面我的代码给了我奇怪的结果,显然你一定得到了1000,但实际上不要期望低于3500。我跑了3500-4500次。我读了一些关于睡眠的文章,睡眠是完全不可靠的。如果java没有用,为什么它不取消它的认证呢 有什么解决办法吗 class MyClass { public static void main ( String[] args ) { long start, end, took;

下面我的代码给了我奇怪的结果,显然你一定得到了
1000
,但实际上不要期望低于3500。我跑了3500-4500次。我读了一些关于睡眠的文章,睡眠是完全不可靠的。如果java没有用,为什么它不取消它的认证呢

有什么解决办法吗

class MyClass {

            public static void main ( String[] args ) {

                    long start, end, took;

                    start = System.currentTimeMillis();
                    for ( int i=0; i<200; i++) {
                            try {
                            Thread.sleep (5);
                            } catch ( Exception ex ) {
                                    ex.printStackTrace();
                            }
                    }
                    end = System.currentTimeMillis();
                    System.out.println("Start :: " + start);
                    System.out.println("end :: " + end);
                    took = end -start;
                    System.out.println ("Took: " + took);

            }
class-MyClass{
公共静态void main(字符串[]args){
漫长的起点、终点、终点;
start=System.currentTimeMillis();

对于(int i=0;i这并不是说它没有用处,只是你必须谨慎地使用它,不要期望一致的结果,因为线程很少有保证。

这并不是说它没有用处,只是你必须谨慎地使用它,不要期望一致的结果,因为线程很少有保证aranteed.

它完全按照它所说的去做,即睡眠至少5毫秒。没有任何东西可以保证它不会等待更长的时间,它从来没有声称过。(不可否认,该方法上的javadoc会给人这样的印象,即线程将立即恢复,实际上这取决于操作系统/jvm,您无法控制它。)

运行3-4秒当然很奇怪。这取决于您的平台/操作系统以及您的计算机当时可能正在执行的其他操作。我得到的结果是1010到1020之间运行的精确代码片段。这是您实际运行的还是您从更大的程序中提取的示例


较旧版本的windows默认至少有15毫秒的睡眠时间,这可以解释超过3秒的睡眠时间。一些JVM修补windows以获得更好的睡眠分辨率,但对于JVM版本和OS版本的任何特定组合,很难说!

它完全按照它所说的做,即睡眠时间至少为5毫秒。没有任何问题arantees它不会等待更长的时间,它从未声称会等待(不可否认,该方法上的javadoc会给人这样的印象,即线程将立即恢复,实际上这取决于操作系统/jvm,您无法控制它)

运行3-4秒当然很奇怪。这取决于您的平台/操作系统以及您的计算机当时可能正在执行的其他操作。我得到的结果是1010到1020之间运行的精确代码片段。这是您实际运行的还是您从更大的程序中提取的示例


较旧版本的windows默认至少有15毫秒的睡眠时间,这可以解释超过3秒的睡眠时间。一些JVM修补windows以获得更好的睡眠分辨率,但对于JVM版本和OS版本的任何特定组合,很难说!

线程中的精确计时。睡眠时间不保证,这正是这就是为什么你在不同的跑步中得到不同的计时


最好在Java中用于实时计算。

线程中的精确计时。不能保证睡眠,这正是在不同运行中获得不同计时的原因


最好在Java中用于实时计算。

如果您需要某种计时器,低级别线程是不合适的。线程利用底层操作系统调度程序将CPU时间分配给系统的进程。实际上,JavaVM也会生成进程,并且JavaVM调度程序会向线程提供CPU时间

当您将线程切换到睡眠状态时,您必须等待调度程序再次唤醒您


如果需要精确计时,请查看TimerTask和Timer。如果需要某种计时器,低级别线程不是正确的选择。线程利用底层OS调度程序将CPU时间分配给系统的进程。事实上,JavaVM也会生成进程,并且JavaVM调度程序会向线程提供CPU时间

当您将线程切换到睡眠状态时,您必须等待调度程序再次唤醒您


如果您需要精确计时,请查看TimerTask和Timer

您使用的是什么平台和JDK/JRE?预计会超过1000个(2000-3000的范围似乎非常合理)。(顺便说一句,我在这里得到的是1010-1020)开始::1330464140994结束::1330464142016 Take:1022这是我的结果,没有什么奇怪的事情请用它来衡量代码执行情况。JDK 7使用Eclipse indigo的新java 7…为什么要负投票?在Eclipse中?你确定你没有一个调试器插入到虚拟机中,可能会稍微扭曲计时?你使用的是什么平台&JDK/JRE?预计超过1000(2000-3000范围似乎非常合理)。(顺便说一句,我在这里得到的是1010-1020。)开始::1330464140994结束::1330464142016 Take:1022这是我的结果,没有什么奇怪的请用于测量代码执行。JDK 7使用Eclipse indigo的新java 7…为什么使用减号表决?在Eclipse中?你确定你没有在VM上插入调试器,可能会扭曲计时吗?要使用实时线程,你需要真正的实时操作系统上的Time Java。请参见此处:大多数应用程序不需要精确的计时计算,因此对Thread.sleep计算很满意。因为Java realtime仅适用于特定版本的solaris和linux:)要使用实时线程,您需要在实时操作系统上使用实时Java。请参阅此处:大多数应用程序不需要精确的计时计算,因此对thread.sleep计算很满意。因为Java realtime仅适用于特定版本的solaris和linux:)