2016-04-16 5 views
0

Я пытаюсь сделать мини-матрицу. Все, что он должен делать, это стрелять либо в 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) {} 
    } 
} 

Просто FYI, то pressToContinue() предполагается завершить время цикла, нажав кнопку ENTER.

+0

только что обнаружил, что 0 в начале относится к 'matrix()'. Не могу понять, почему он был активирован. – kwolff7

+0

Причина, по которой она активирована, - это не дождаться завершения таймера до вызова матрицы. Попробуйте использовать ScheduledExecutorService, который позволит вам подождать. – Learner

ответ

0

Попробуйте эту альтернативу ... используя 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

Решила ли ваша проблема? – Learner

+0

Обратный отсчет работает, теперь это глупый 'pressEnterToContinue()', который больше не работает. LOL благодарит вас за помощь, должен уметь это понять отсюда. – kwolff7

0

Он напечатан в результате

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

0? Я, наконец, понял, что ... как я могу получить 'matrix()' для активации после 'timer()'? – kwolff7

+0

Да, ваш 0 напечатан этой линией, которая добавляет ее до вашего таймера setInterval() – Learner

+0

Есть ли у вас какие-либо идеи о том, как заставить его прийти после? Кажется, он не работает. – kwolff7

Смежные вопросы