`
sunlujing
  • 浏览: 177928 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java timeOut的实现

阅读更多

     用NIO socket读取网络数据,找了好久没找到,NIO下设置读超时的API,只好自己写了一个。

     思路是设置守护进程,启动后等待 一定的时间,如果在等待一定的时间后还没被唤醒,则抛出超时异常。

 

        //设置超时守护进程
                         TimeOutThread t = new TimeOutThread(5000,new TimeoutException("reading      timeOut"));
                         t.start();
                        
                        
                         count=client.read(protocalNum);  
                         count=client.read(functionNum);
                         count=client.read(messageLen);
                         messageLen.rewind();
                         int length = messageLen.asIntBuffer().get(0);
                      
                         receivebuffer = ByteBuffer.allocate(length-12);
                         receivebuffer.clear();
                         
                         count=client.read(receivebuffer);
                                             
                       t.cancel();
                       notifyAll(); 

 

        TimeOutThread.java

 

    private long timeOut ;
    private boolean isCanceled = false;
    private TimeoutException exception;
   
    public TimeOutThread(long timeOut,TimeoutException exception){
     super();
     this.timeOut = timeOut;
     this.exception = exception;
     this.setDaemon(true);
    }
   
    public synchronized void cancel(){
     this.isCanceled = true;
     
    }
   
    public synchronized void  run(){
     try{
      wait(timeOut);
      if(!isCanceled){
       throw exception;
      }
     }
     catch(InterruptedException e){
      e.printStackTrace();
     }
    }

 

    TimeOutException.java 就不写了。

 

  

0
0
分享到:
评论
2 楼 九尾狐的yi巴 2017-02-27  
Jenercy 写道
目测没用。TimeOutThread抛出的TimeoutException 最终会被拦截并且打印出来。
而且TimeOutThread抛出异常只会让TimeOutThread这个线程结束运行,对主线程不会产生影响。超时后只会打印出超时信息,主线程的代码仍然会继续运行,调用该函数的代码仍然会卡住。不信可以在主线程里写个死循环看能不能在超时后结束


确实是这样 有没有什么解决办法?
1 楼 Jenercy 2017-01-03  
目测没用。TimeOutThread抛出的TimeoutException 最终会被拦截并且打印出来。
而且TimeOutThread抛出异常只会让TimeOutThread这个线程结束运行,对主线程不会产生影响。超时后只会打印出超时信息,主线程的代码仍然会继续运行,调用该函数的代码仍然会卡住。不信可以在主线程里写个死循环看能不能在超时后结束

相关推荐

    Java串口通信实现二台电脑的串口通信

    Java串口通信。用了com包。检测电脑上的可用串口,实现串口通信

    java map 实现缓存技术

    java map 缓存 //毫秒计算 this.timeOut = timeOut*1000;

    Mikrotik RouterOS API的Java客户端库实现

    添加了一个新方法connect(SocketFactory fact, String host, int port, int timeout) ,以允许用户更好地控制套接字,尤其是加密。 connectTLS() API方法已删除。 大多数重载的connect()方法都已删除。 在下载

    在ASP.NET中,设置Session的过期时间的方法

    方法一:  在后台应用程序中设置:Session.Timeout = 1;  注意:1、此方法可以设置在一个... 您可能感兴趣的文章:php 如何设置一个严格控制过期时间的sessionjava设置session过期时间的实现方法php中实现精确设置se

    用Java实现多线程服务器程序

    Java软件包内在支持的网络协议为TCP/IP,也是当今最流行的广域网...public synchronized void setSoTimeout (int timeout) throws SocketException ; public synchronized int getSoTimeout() throws IOException ; }

    使用Java异步编程实现一个简单的网络请求.txt

    首先,我们定义了一个URL地址和一个超时时间(TIMEOUT),然后使用ExecutorService创建了一个线程池,该线程池包含两个线程。接下来,我们通过调用executor.submit()方法提交了两个任务,分别对应GET和POST两种HTTP...

    overpasser, 通过查询立交桥来实现数据的Java接口.zip

    overpasser, 通过查询立交桥来实现数据的Java接口 overpasser 通过查询立交桥 API,向 OpenStreetMap的流体Java接口提供了数据。 没有更多的查询字符串手工...示例代码像这样的立交桥查询:["out":"json"]["timeout":

    mikrotik-java:Mikrotik RouterOS API的Java客户端实现

    添加了一个新方法connect(SocketFactory fact, String host, int port, int timeout) ,以允许用户更好地控制套接字,尤其是加密。 connectTLS() API方法已删除。 大多数重载的connect()方法都已删除。 在下载

    操作系统Java实现SJF代码

    System.out.println("时刻"+p[i].startTime+": 进程"+p[i].pid+"开始运行,完成时间为:"+p[i].finishTime+",周转时间为:"+p[i].WholeTime); sumWT+=p[i].WholeTime; } AverageWT=sumWT/p.length; System....

    基于JAVA的医院门诊信息管理系统设计与实现.doc

    基于JAVA的医院门诊信息管理系统设计与实现 摘 要 医院门诊信息管理系统是一个基于Internet的应用系统,它是一个面对当前的医院门 诊管理工作基本还处于手工和半信息自动化处理状态而应运而生的一个基于Internet的...

    OrientDB(基于Java的文档数据库) v1.0 图形版

    Orient DB 是一个可伸缩的文档数据库,支持 ACID 事务处理,使用Java 5实现。 OrientDB VERSION 1.0 - (May, 14th 2012)- new Multi-Master Replication architecture- new Object Database interface that use run...

    基于Java的无人超市购物系统的设计与实现.docx

    I 第1页(共26页) 第18页(共26页) 基于Java的无人超市购物系统的设计与实现 II 基于Java的无人超市购物系统的设计与实现全文共28页,当前为第1页。基于Java的无人超市购物系统的设计与实现全文共28页,当前为第1...

    ARQ自动重传协议模拟

    它包括停止等待ARQ协议和连续ARQ协议,错误侦测(Error Detection)、正面确认(Positive Acknowledgment)、逾时重传(Retransmission after Timeout)与负面确认继以重传(Negative Acknowledgment and ...

    Linux下Socket连接超时的一种实现方法

    本文详细介绍了目前各平台通用的设置套接字(Socket)连接超时的办法,介绍了Linux环境下的Socket连接超时的一种实现方法。

    java常用工具类的使用

    “工欲善其事,必先利其器”,在Java程序开发过程中,很多算法(比如:MD5加密算法)、很多数据结构(比如链表LinkedList)已经实现并且大多放在类库的java.util包中,程序员只需要了解各种工具的功能就可以直接调用...

    java高并发秒杀系统.rar

    idle-timeout: 18000 # 最大连接数,默认10 maximum-pool-size: 10 # 从连接池返回的连接自动提交 auto-commit: true # 连接最大存活时间,0表示永久存活,默认1800000(30分钟) max-lifetime: 1800000 # ...

    Web应用开发技术课程设计-基于Java实现的车辆管理系统项目源码+项目说明.zip

    car_id car_color car_owner car_brand status intime outtime statusint char char char char char datetime datatime int 鲁A09836 灰色 杜姆杜姆 标志 临时 2022-12-10 16:45:11 2022-12-10 16:45:29 1 【备注】 ...

    线程超时死掉

    V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException 同上面的get功能一样,多了设置超时时间。参数timeout指定超时时间,uint指定时间的单位,在枚举类...

    neat-chess:Java UCI协议实现(通用国际象棋引擎)

    一个用Java编写的简单 (通用国际象棋接口)客户端。 用测试 。文献资料启动/关闭客户端通过使用startStockfish()方法,客户端假定系统中已经安装了Stockfish,并且在$PATH... // default timeout 5 secondsuci . star

    File_实用案例_实现文件拷贝_FileCopy.java

    // So we copy the file, a buffer of bytes at a time. FileInputStream from = null; // Stream to read from source FileOutputStream to = null; // Stream to write to destination try { from = new ...

Global site tag (gtag.js) - Google Analytics