Джава. Простой TimerTask для каждого значения массива - PullRequest
0 голосов
/ 02 апреля 2011

У меня проблема с распечаткой каждого значения определенного массива с определенной продолжительностью времени. Например, у меня есть массив со значениями: «Value1», «Value2», «Value3». Я хочу вывести «Value1», через 5 секунд «Value2», через 5 секунд «Value3». Вместо этого все значения массивов выводятся 3 раза. Если бы вы могли помочь мне, я буду так благодарен)) Спасибо.

Вот мой код.

import java.util.Date;

public class Timer2 {

    /**
     * @param args
     */
    public static void main(String[] args) {

        long start = new Date().getTime();

        for (int i = 0; i < 4; i++) {
            new java.util.Timer().schedule(new java.util.TimerTask() {

                public void run() {
                    String[] arrayElements = { "value1", "value2", "value3",
                            "value4" };
                    for (int i = 0; i < arrayElements.length; i++)
                        System.out.println(arrayElements[i]);

                }
            }, new Date(start));
            start += 1000;
        }
    }

}

Ответы [ 3 ]

3 голосов
/ 03 апреля 2011

Решение из моего ответа в кросс-посте, использующее scheduleAtFixedRate:

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

class Timer2 {

   private static final String[] ARRAY_ELEMENTS = {"value1", "value2", "value3", "value4"};

   public static void main(String[] args) {
      final Timer utilTimer = new Timer();
      utilTimer.scheduleAtFixedRate(new TimerTask() {
         private int index = 0;

         public void run() {
            System.out.println(ARRAY_ELEMENTS[index]);
            index++;
            if (index >= ARRAY_ELEMENTS.length) {
               utilTimer.cancel();
            }
         }
      }, 5000L, 5000L);
   }

}
3 голосов
/ 02 апреля 2011

Самый простой способ сделать то, что вы описали, что вы хотите сделать, это:

public static void main(String[] args) throws InterruptedException {
    String[] arrayElements = { "value1", "value2", "value3", "value4" };

    for (int i = 0; i < arrayElements.length; i++) {
        System.out.println(arrayElements[i]);
        Thread.sleep(5000);
    }   
}

Если вы должны использовать TimerTask, вы можете сделать:

public static void main(String[] args) throws InterruptedException {
    String[] arrayElements = { "value1", "value2", "value3",
    "value4" };

    long start = System.currentTimeMillis();

    for (int i = 0; i < arrayElements.length; i++) {
        final String value = arrayElements[i];
         new java.util.Timer().schedule(new java.util.TimerTask() {
                public void run() {
                    System.out.println(value);
                }
         }, new Date(start));

         start += 5000;
    }       
}
0 голосов
/ 02 апреля 2011

Вы помещаете цикл печати в TimeTask.run (), чтобы при его выполнении все значения выводились сразу.Вам нужно создать временную задачу для каждого элемента массива.Что-то вроде:

String[] arrayElements = {"value1", "value2", "value3", "value4"}; for (final String arrayElement : arrayElements) { new java.util.Timer().schedule( new java.util.TimerTask() { public void run() { System.out.println(arrayElement); } }, new Date(start) ); start+=1000; }

Надеюсь, это поможет.

...