wait等待和超时处理

1,目前我这个需求是需要做超时处理的,所有需要用timer进行定时器,超时直接退出。

Timer tt=new Timer();
tt.schedule(new TimerTask() {
public void run() {
System.out.println(“超时”);
timeOut=true;

            }
        },1000);//等待1s,数据发送完毕,如果没有则超时

        while (flag){//如果这个服务的数据帧接收完毕,则不循环,进行下一个服务
            //循环查询当前对象数据状态是否结束,待写
            //如果结束,则flag置为false,退出循环

            System.out.println("while");
            if(timeOut){
                System.out.println("超时lala");

                return;//如果超时,直接退出
            }
            if (serviceModel.getUdsFlag()){
                flag=false;
            }
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        tt.cancel();//取消超时

2,wait是做线程同步的,如果目前,如果wait的等待时间到了,那么等待的线程将继续进行,继续的时候再取判断当前获取到的状态,也可以,

synchronized (result) {
result.put(UpdateStep.FlowControl, null);
result.wait(1000);//等待流控制帧,如果1s不回复,那么则退出。
if((result.get(UpdateStep.FlowControl) == null)||(result.get(UpdateStep.FlowControl) == false))
{
System.out.println(“Result Don’t receive the flow control frame!”);
return false;
//System.out.println(“Don’t receive the flow control frame!”);
}
else{
System.out.println(“receive the flow control frame!”);
result.put(UpdateStep.FlowControl, null);}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
epoll_wait 函数可以用来等待多个文件描述符的事件,其函数原型如下: ```c int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); ``` 其中,timeout 参数用于设置等待超时时间。具体来说,当 timeout 为正整数时,epoll_wait 函数会等待 timeout 毫秒,如果在此期间内没有任何事件发生,则返回 0;当 timeout 为 0 时,epoll_wait 函数会立即返回,不会等待任何事件;当 timeout 为 -1 时,epoll_wait 函数会一直等待,直到有事件发生为止。 需要注意的是,如果 timeout 参数为正整数,则在调用 epoll_wait 函数前需要先设置一个定时器,以便在超时时触发 SIGALRM 信号,从而中断 epoll_wait 函数的阻塞。这可以通过调用 setitimer 函数来实现,例如: ```c #include <sys/time.h> struct itimerval it; it.it_value.tv_sec = timeout / 1000; it.it_value.tv_usec = (timeout % 1000) * 1000; it.it_interval.tv_sec = 0; it.it_interval.tv_usec = 0; setitimer(ITIMER_REAL, &it, NULL); ``` 此处设置了一个定时器,使其在 timeout 毫秒后触发 SIGALRM 信号。然后在调用 epoll_wait 函数前,需要将 SIGALRM 信号的处理函数设置为一个空函数,以避免在超时时终止进程。例如: ```c #include <signal.h> void sigalrm_handler(int signum) { } signal(SIGALRM, sigalrm_handler); ``` 最后,在调用 epoll_wait 函数后,需要将定时器取消,以避免下一次调用 epoll_wait 函数时受到影响。例如: ```c setitimer(ITIMER_REAL, NULL, NULL); ``` 以上就是在使用 epoll_wait 函数时设置超时的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鼾声鼾语

感谢您的支持鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值