2014-09-30 2 views
0

Если создать список Таймеры следующим образом:Определить таймер, созданный в списке

timers = new ArrayList<Timer>(); 

for(int i = 0; i<10;i++) 
{ 
     Timer timer = new Timer(); 
     timer.schedule(new TimerTask() { 

      @Override 
      public void run() { 

       //Task of timer here      


       } 
      }, 0, 1000); 

     timers.add(timer); 
} 

Как я могу определить, в бегах() метод, что элемент списка есть?

Если я так не работает, потому что я буду все настройки идентификатора последнего таймера:

timers = new ArrayList<Timer>(); 

for(int i = 0; i<10;i++) 
{ 
     final int timerId = i; 
     Timer timer = new Timer(); 
     timer.schedule(new TimerTask() { 

      @Override 
      public void run() { 

       //Task of timer here  
       int id = timerId; 


        } 
       }, 0, 1000); 

     timers.add(timer); 
} 
+0

Вы можете заставить его работать, если вы сделаете timerId окончательным ... final int timerId = i; Обратите внимание, что вы делаете это окончательным, вы не можете изменить значение – StackFlowed

ответ

2

Может использовать другую структуру данных. IE: Hashmap, свяжите ключ (в вашем случае, идентификатор) с объектом Timer.

Объект Timer также может принимать в конструкторе String.

От Javadoc:

Создает новый таймер, присоединенное нить имеет указанное имя.

Вы бы затем выполнить метод GetName() на тему в вашем исполняемым:

Thread.currentThread().getName(); 
+0

Если я создаю таймер со строкой в ​​конструкторе, как мне получить доступ к имени из метода run()? Таймер не имеет методов. – user3782779

+0

Он прикрепляет имя к потоку, запускающему таймер. IE: Thread.currentThread(). GetName() – proulxs

1

Вы можете расширить TimerTask и реализовать функциональные возможности вы ищете

class MyTimerTask extends TimerTask{ 
    private int timerId; 
    public MyTimerTask(int timerId){ 
     this.timerId = timerId; 
    } 
    @Override 
    public void run() {} 
} 
... 
timers = new ArrayList<Timer>(); 

for(int i = 0; i<10;i++) 
{ 
     final int timerId = i; 
     Timer timer = new Timer(); 
     timer.schedule(new MyTimerTask(timerId), 0, 1000); 

     timers.add(timer); 
} 
1
final List<Timer> timers = new ArrayList<Timer>(); 

for(int i = 0; i<10;i++) {    
    final Timer timer = new Timer(); 
    timer.schedule(new TimerTask() { 

     @Override 
     public void run() { 

      //Task of timer here  
      int id = timers.indexOf(timer); 


     } 
    }, 0, 1000);  
    timers.add(timer); 
} 

Также хорошо, потому что быстрее для большего количества таймеров будет HashMap/HashTable:

final Map<Integer, Timer> timers = new Hashtable<Integer, Timer>(); 

for(int i = 0; i<1000;i++) {    
    final Timer timer = new Timer(); 
    timer.schedule(new TimerTask() { 

     @Override 
     public void run() { 

      //Task of timer here  
      int id = timer.hashCode(); 
      Timer t = timers.get(id); 

     } 
    }, 0, 1000);  
    timers.add(timer.hashCode(), timer); 
} 
1

Создайте свою собственную задачу таймера, которая может управлять вашим идентификатором, соответствующим задаче таймера.

public class MyTimerTask extends TimerTask { 

int id; 
public MyTimerTask(int id) { 
    this.id = id; 

} 


@Override 
public void run() { 
System.out.println("Running task id:"+id); 
} 

}

А потом

timers = new ArrayList<Timer>(); 
for(int i = 0; i<10;i++) 
{ 
     Timer timer = new Timer(); 
     timer.schedule(new MyTimerTask(i),0, 1000); 

     timers.add(timer); 
} 

Надеется, что это поможет.

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