2014-09-30 27 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); 
} 

如何識別運行中()方法是什麼列表項是什麼?

如果我做如下不起作用,因爲我將設置最後的定時的所有ID:

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,則可以使其工作... final int timerId = i;請注意,因爲你使它最終不能修改值 – StackFlowed 2014-09-30 15:09:34

回答

2

可以使用不同的數據結構。 IE:Hashmap,將一個密鑰(在你的情況下,ID)鏈接到Timer對象。

Timer對象也可以在構造函數中使用String

,通過javadoc:

創建一個新計時器,其相關的線程具有指定的名稱。

這樣,你會在執行的線程的getName()方法你可以運行:

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

如果我在構造函數中使用字符串創建Timer,如何從run()方法訪問名稱?計時器沒有獲取方法。 – user3782779 2014-09-30 15:11:22

+0

它將一個名稱附加到運行定時器的線程。 IE:Thread.currentThread()。getName() – proulxs 2014-09-30 15:15:22

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

創建您的自定義計時器任務,它可以管理您的id對應於計時器任務。

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); 
} 

希望這會有所幫助。