Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.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 - Fatal编程技术网

Java 计时器功能问题

Java 计时器功能问题,java,Java,我想做一个迷你矩阵的东西。它所要做的就是打出0或1。代码是好的,但我试图让它做一个倒计时开始(3,2,1-然后开始)。正在通过activate()在另一个文件中调用它 不起作用的是计时器。出于某种原因,它将0放在前3的前面: 03 2 1 而且它不会激活矩阵函数。这是密码,如果有人能帮我的话 import java.util.Timer; import java.util.TimerTask; public class Matrix { public boolean matrix

我想做一个迷你矩阵的东西。它所要做的就是打出0或1。代码是好的,但我试图让它做一个倒计时开始(3,2,1-然后开始)。正在通过
activate()
在另一个文件中调用它

不起作用的是计时器。出于某种原因,它将0放在前3的前面:

03
2
1
而且它不会激活矩阵函数。这是密码,如果有人能帮我的话

import java.util.Timer;
import java.util.TimerTask;

public class Matrix {

    public boolean matrix = true;
    static int interval;
    static Timer timer;

    public String activate() {
        String done = "";
        timer();
        return done;
    }

    private void matrix() {
        while(matrix) {
            System.out.print((int) (Math.random()+0.5));
            pressEnterToContinue();
        }
    }

    private void timer() {
        System.out.println("press ENTER to stop\n"+
                           "starting in");

        int delay = 1000;
        int period = 1000;

        timer = new Timer();
        interval = 3;
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                System.out.println(setInterval());
            }
        }, delay, period);
        matrix();
    }

    private static final int setInterval() {
        if (interval == 1) {
            timer.cancel();
        }
        return interval--;
    }

     private void pressEnterToContinue() {
        try
        {
            System.in.read();
            matrix = false;
        }  
        catch(Exception e) {}  
    }
}

仅供参考,pressToContinue()应该通过按ENTER键结束while循环

它是由于

System.out.print((int) (Math.random()+0.5));

尝试此选项…使用
ScheduledExecutorService

import java.util.Timer;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

public class Matrix {

 public boolean matrix = true;
 static int interval = 3;
 static Timer timer;
 private final ScheduledExecutorService scheduler =
       Executors.newScheduledThreadPool(1);

 public String activate() {
    String done = "";
    scheduleTimer();
    return done;
 }

 private void matrix() {
    while(matrix) {
        System.out.print((int) (Math.random()+0.5));
        pressEnterToContinue();
    }
 }

 public void scheduleTimer() {
    System.out.println("Starting in:");
    final Runnable timer = new Runnable() {
        public void run() { System.out.println(setInterval()); }
    };

    scheduler.scheduleAtFixedRate(timer, 1, 1, TimeUnit.SECONDS);

    try {
        scheduler.awaitTermination(1, TimeUnit.DAYS);
        matrix();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
 }

 private final int setInterval() {
    if (interval == 1) {
        scheduler.shutdown();
    }
    return interval--;
  }

  private void pressEnterToContinue() {
    try
    {
        System.in.read();
        matrix = false;
    }  
    catch(Exception e) {}  
 }

  public static void main(String[] args){
     Matrix mat = new Matrix();
     mat.activate();
  }
}

刚发现开头的0来自
矩阵()
。但是,我不明白为什么它会被激活。它被激活的原因是你没有等到计时器完成后才调用matrix。请尝试使用ScheduledExecutorService,该服务将允许您等待。0?我终于意识到…我如何在
定时器()之后激活
矩阵()
?是的,你的0是由这行打印的,它在你的定时器设置间隔()之前打印出来的。你有什么想法吗?似乎无法使其工作。您是否考虑过使用ScheduledExecutorService而不是计时器来安排定期任务。ScheduledExecutorService提供了一个shutdown()方法,该方法将执行任何挂起的任务。然后,您可以调用waittermination()来等待shutdown()完成。倒计时工作,现在是愚蠢的
按entertocontinue()
不再工作。哈哈,谢谢你的帮助,应该可以从这里找到答案。