Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中使用计时器而不使用线程?_Java_Wait - Fatal编程技术网

如何在java中使用计时器而不使用线程?

如何在java中使用计时器而不使用线程?,java,wait,Java,Wait,如果不使用Thread.sleep,如何让java程序等待X秒 public class newClass{ public static void main(String[] args){ for(int i = 0; i < 10; i++){ //Wait X second System.out.println("Hello"); } } } 公共类newCl

如果不使用
Thread.sleep
,如何让java程序等待X秒

public class newClass{
     public static void main(String[] args){
           for(int i = 0; i < 10; i++){
               //Wait X second 
               System.out.println("Hello");
           }
     }
}
公共类newClass{
公共静态void main(字符串[]args){
对于(int i=0;i<10;i++){
//等X秒
System.out.println(“你好”);
}
}
}
谢谢你的帮助


我需要程序在计数时不会冻结

这是一种糟糕的方法,但您可以使用以下方法:

 public class newClass{
      public static void main(String[] args){
           int X = 5;
           for(int i = 0; i < 10; i++){
               long s = System.nanoTime();
               while( (System.nanoTime() - s) / 1000000000 < X);
               System.out.println("Hello");
           }
      }
 }

您真正想要的是多线程实现。这将允许您继续与应用程序的一个区域交互,同时等待另一个区域完成处理

编辑
好的,在评论中进一步澄清之后,听起来这不是你想要的。也许您可以在HashMap中注册每个孩子的开始时间。然后监视地图,看时间到了。

< P>如果你的问题是你不想让程序冻结,考虑使用线程。此示例可能与您想要实现的类似:。

似乎您希望程序启动,并且在X时间过后在输出流上打印“Hello”

  • 照奥科扎普的建议去做
  • 或者使用线程。睡眠(x);方法

  • 这两个选项都将给您提供完全相同的结果,尽管选项2是首选选项,因为您允许CPU在主线程睡眠时执行其他操作,而且使用选项1会使您对程序的意图不那么清楚。

    您可以使用Java的Timer和TimerTask类来实现这一点

     import java.util.Timer;
     import java.util.TimerTask;
     public class newClass extends TimerTask{
          int i = 10;
          static Timer timer;
    
          @Override
          public void run(){
               System.out.println("hello");
               i--;
               if (i == 0)
                   timer.cancel();
    
          }
    
          public static void main(String[] args){
               TimerTask timerTask = new newClass();
               timer = new Timer(false);
               timer.scheduleAtFixedRate(timerTask, 0, 5 * 1000);
          }
     }
    

    定时器在后台自己的线程上工作,所以它不会冻结程序的其余部分

    wait()。那么,你的问题是什么?你是在问忙着等待吗?你认为等待和睡觉之间的区别是什么?等待/睡觉之间的区别是什么?这就是我的意思!你能给我解释一下吗?在每个while循环步骤中,该代码控制当前时间并以秒为单位计算经过的时间。这是不好的,因为它会使用CPU周期,不像
    sleep()
    wait()
    命令,所以这只是一个坏把戏。不,等等,它仍然会使我的软件冻结:(我怎么能使用wait()?如果你不想让你的程序冻结,你应该使用像ian提到的多线程方法。我怎么能让它写10次“Hello”?您能更改代码吗?TimerTask应该以固定的间隔重复,直到您调用cancel(),所以此代码应该重复10次。它不是这样工作的吗?不,我不知道为什么,因为我从未使用过这样的代码OK,只需将行“timer=new timer(true)”更改为“timer=new timer(false)”告诉我这是否有效是的它有效!!你能给我解释一下代码吗?加上注释也很好:)
     import java.util.Timer;
     import java.util.TimerTask;
     public class newClass extends TimerTask{
          int i = 10;
          static Timer timer;
    
          @Override
          public void run(){
               System.out.println("hello");
               i--;
               if (i == 0)
                   timer.cancel();
    
          }
    
          public static void main(String[] args){
               TimerTask timerTask = new newClass();
               timer = new Timer(false);
               timer.scheduleAtFixedRate(timerTask, 0, 5 * 1000);
          }
     }