假设当向某个连接列表发送消息时,需要启动一个等待发送确认的定时器。
为了存储一组预期的交付确认,已经创建了一个特定的映射:
HashMap<Thread, ArrayList<MessagePacket>> aConfirmationMap = new [...];
发送消息时这张卡被填满(每个数据包在发送前都被添加到等待列表中Thread
)。
为了实现等待计时器,我决定使用TimerTask
添加的那个Timer
:
for (SocketThread thread : aConnectionThread)
{
aConfirmationMap.get(thread).add(packet);
// Добавление заданий проверки доставки
aConfirmationTimer.schedule(new TimerTask()
{
public void run()
{
// TODO: обработка истечения времени ожидания подтверждения доставки.
// !!! Нет доступа к локальным переменным !!!
if(aConfirmationMap.get(thread).contains(packet))
{
}
}
}, 1000);
thread.syncWrite(packet.bytes);
}
结果很符合预期,对局部变量的引用是无效的:
不能引用封闭范围内定义的非最终局部变量包
问题:如何创建负责重新发送消息的传递确认等待作业,每个消息都将存储自己的一对Thread
- MessagePacket
(检查它是否已从MessagePacket
等待数组中删除)?
事实上,为了
TimerTask()
访问函数的局部变量(甚至迭代的局部变量),给它们一个修饰符就足够了final
: