VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 801|回复: 3

关于java中的计时问题

[复制链接]

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-1-24 16:20:01 | 显示全部楼层 |阅读模式
说一下流程:
当一个数据报DatagramPacket做好了,就要用DatagramSocket.send()进行发送。
问题出现了:
这个时候需要启动一个定时器,当定时器到时间之后,还没有收到数据报的反馈,那么我们可以猜测:接受方没有收到我们发送的数据报。那么我们就要自动重新发送一个数据报。
问题是,这个定时器怎么实现。

如果用Timer类来实现的话,那么在TimerTask重写的run()方法里面执行的必须是静态的代码(应该是这样吧),那么就没有办法重新发送这个DatagramPacket,因为它不是final的。

请问各位大侠,怎么解决这个问题?
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-2-11 19:15:01 | 显示全部楼层
不完全明白你的意思。

在发送数据的同时启动计时器,在指定时间后执行超时的工作(重新发送数据);如果有及时的反馈则停止该计时器(防止重复发送数据)。
回复

使用道具 举报

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-2-13 16:45:01 | 显示全部楼层
没错.收到反馈,那么就停止计时器。比如使用Timer类的cancel方法。
如果没有反馈,那么就应该重新发送数据报……可是TimerTask类中的run方法似乎不太适合用来重新发送数据报吧,因为这个DatagramSocket,DatagramPacket都不是final的
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-2-15 13:00:01 | 显示全部楼层
这和是否是final无关吧?不知道你的代码是怎么写的

你的DatagramSocket,DatagramPacket对象是作为方法参数传入的并且这两个参数又被传入到方法里面定义的匿名类中?如果是这样,那么这样好了(在方法参数声明上加final):
public void aMethod(final DatagramSocket ds, final DatagramPacket dp) {
    Timer timer = new Timer();
    timer.schedule(new TimerTask(){
        public void run(){
            ds.send(dp);
        }
    }, 10 * 1000);
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表