如果我按以下方式创建计时器列表:
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);
}
如何在run()方法中识别列表项是什么?
如果我这样做,则不起作用,因为我将设置最后一个计时器的所有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 :(得分:2)
可以使用不同的数据结构。 IE:Hashmap
,将密钥(在您的情况下,ID)链接到Timer
对象。
Timer对象也可以在构造函数中接受String
。
来自javadoc:
创建一个新的计时器,其关联的线程具有指定的名称。
然后,您将在runnable中的Thread上执行getName()方法:
Thread.currentThread().getName();
答案 1 :(得分: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);
}
答案 2 :(得分: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);
}
答案 3 :(得分: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);
}
希望这会有所帮助。