2013-04-16 2 views
-3

Мне нужно добавить «машину» в очередь каждые две минуты и удалить «автомобиль» из очереди каждые 2 минуты. Затем, когда это возможно, переместите машины из стека в очередь, когда очередь открывается за один и тот же шаг времени.Выполнение раздела кода каждые x минут

public static void main(String[] args) { 

    int lp = 10000; 
    int i = 10;  
    int maxQueue = 0; 
    int maxStack = 0; 
    Lstack stack = new Lstack(); 
    Lqueue queue = new Lqueue(); 
    int cr = 1; //cars removed 

    Scanner input = new Scanner(System.in); 

    for (int size = 0; size < 26; size++) { 


     **// arrivals, need to add 2 min wait**   
     if (maxQueue < 6){       
     Car car = new Car(Integer.toString(lp), 'X');    
     queue.insert(car); 
     lp = lp + i; 
     maxQueue++; 
    }  

    else if (maxQueue > 6){ 
     Car car = new Car(Integer.toString(lp), 'X'); 
     stack.push(car); 
     lp = lp + i; 
     maxStack++; 
    } 

    else if((maxQueue > 6) && (maxStack > 6)){ 
     System.out.println("Sorry there isn't enough room"); 
     cr++; 
     System.out.println("New amount to be taken away:" + cr); 
    }  

     **// removals, need to add the wait 5 min** 
     if (maxQueue != 0){    
     for(i = 0; i < cr; i++){ 
      queue.remove(); 
      System.out.println("Car" + lp + "was/were removed"); 
     }    
     maxQueue--; 
     } 

     else if(maxQueue == 0){ 
      cr++; 
     } 
     System.out.println("Before Driveway Moves:"); 
     queue.display(); 
     stack.display(); 

     // empty driveway 

     while((maxQueue < 6) && (maxStack != 0)){ 
      System.out.println("Moving car " + lp + " to the driveway"); 
      queue.insert(stack.pop()); 
     } 
     System.out.println("After Driveway Moves: "); 
     queue.display(); 
     stack.display(); 

    } 
} 
+3

Что ваш вопрос? –

+0

Не знаю, как добавить 2 минуты ожидания и 5 минут ожидания между добавлением и удалением – user2284671

+0

Вы всегда можете использовать Thread.sleep, хотя, конечно, вы никогда не должны этого делать в графическом интерфейсе. –

ответ

1

Всегда можно использовать таймер. Вы хотите, чтобы удаление или вставка не зависели друг от друга?

Это самый простой пример таймера:

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

public class TimerEx extends TimerTask { 

    @Override 
    public void run() { 
     System.out.println("I get printed every 2 minutes."); 
    } 

    public static void main(String[] args) { 
     Timer t = new Timer(); 
     t.scheduleAtFixedRate(new TimerEx(), 0, 2*60*1000); 
    } 
} 
+0

Время мудро, да, я хочу, чтобы удаление/вставка не зависели друг от друга! – user2284671

+0

Извините, если это звучит глупо, но как я могу интегрировать это с уже существующим кодом? – user2284671

+0

@ user2284671 вы можете сделать то, что сказал мистер @ Томаз. Поскольку он включает в себя потоки, обязательно сохраните его код синхронизации cheers – DarthCoder

0

Из того, что я понимаю, что вы не хотите, чтобы просто ждать, но, чтобы добавить/удалить автомобили в интервалах (добавить автомобилей после 2,4, 6 ... минут, удалите после 5, 10 ... вместо того, чтобы добавить все автомобили с интервалом в 2 минуты, а затем удалите все автомобили с 5-минутными интервалами).

Самый чистый способ сделать это - использовать Thread, который будет считать интервалы для вас. Вы можете попробовать с этим классом.

public class Timer implements Runnable 
{ 
    private TimerCallback pCallback; 
    private Thread pThread; 
    private long pInterval; 
    private int pTimerId; 

    private boolean pStopRequested; 

    public interface TimerCallback 
    { 
     public void onTimerTick(int timerId); 
    } 

    public Timer(int id, long interval, TimerCallback callback) 
    { 
     pStopRequested = false; 
     pTimerId = id; 
     pInterval = interval; 
     pCallback = callback; 
     pThread = new Thread(this); 
     pThread.start(); 
    } 

    public void stopTimer() 
    { 
     pStopRequested = true; 
     pThread.interrupt(); 
    } 

    @Override 
    public void run() 
    { 
     while(true) 
     { 
      // wait 
      try 
      { 
       Thread.sleep(pInterval); 
      } 
      catch(InterruptedException e) 
      { 
       // Restore the interrupted status 
       Thread.currentThread().interrupt(); 
      } 

      if(pStopRequested) 
       return; 
      else 
       pCallback.onTimerTick(pTimerId); 
     } 
    } 
} 

И это часть того, как его использовать.

public class MyCarsQueue 
{ 
    private static final int MINUTE = 1*1000;// 60*1000; 
    private static final int LIMIT = 26; 

    public synchronized void addCar() 
    { 
     // do what you want to do when a new car is added 
    } 

    public synchronized void removeCar() 
    { 
     // do what you want to do when a car is removed 

    } 

    public static void main(String args) 
    { 
     final MyCarsQueue driveway = new MyCarsQueue(); 
     final int[] limit = new int[1]; 

     // create a callback for timers 
     Timer.TimerCallback callback = new Timer.TimerCallback() { 
      @Override 
      public void onTimerTick(int timerId) 
      { 
       if(timerId == 0) driveway.addCar(); 
       if(timerId == 1) driveway.removeCar(); 

       synchronized (limit) { 
        limit[0]++; 
        limit.notify();     
       } 
      } 
     }; 

     // start timers 
     Timer twoMinutesTimer = new Timer(0, 2*MINUTE, callback); 
     Timer fiveMinutesTimer = new Timer(1, 5*MINUTE, callback); 

     // wait until timers have completed 
     try 
     { 
      synchronized (limit) { 
       while(limit[0] < LIMIT) 
       { 
        limit.wait(); 
       } 
      } 
     } 
     catch (InterruptedException e) { 
      // Restore the interrupted status 
      Thread.currentThread().interrupt(); 
     } 

     // finished (the limit has been reached) 
     fiveMinutesTimer.stopTimer(); 
     twoMinutesTimer.stopTimer(); 
    } 
} 

Вместо таймера вы можете использовать существующие ScheduledExecutorService

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

Runnable run = new Runnable() { public void run() { driveway.addCar(); }}; 
ScheduledFuture<?> delayHandle 
    = scheduler.scheduleAtFixedRate(run, 2, 26*2, TimeUnit.MINUTES); 

// wait until delayHandle.isDone(); returns false 
+0

плохо попробуйте! спасибо кучу и спасибо за разъяснение для меня об этом, выполняя с интервалом, не дожидаясь! – user2284671

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