`
sunlujing
  • 浏览: 179703 次
  • 性别: 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这个线程结束运行,对主线程不会产生影响。超时后只会打印出超时信息,主线程的代码仍然会继续运行,调用该函数的代码仍然会卡住。不信可以在主线程里写个死循环看能不能在超时后结束

相关推荐

    Xmodem和Ymodem 传输协议JAVA实现

    本文将深入探讨这两种协议的工作原理,并提供它们在Java环境中的实现。 **Xmodem协议** Xmodem是最简单的文件传输协议之一,每一步传输128字节的数据块。它通过校验和机制来检测数据传输中的错误。Xmodem协议分为两...

    java.net.SocketTimeoutException: Receive timed out

    在Java的Socket编程中,我们可以通过设置Socket对象的`setSoTimeout(int timeout)`方法来指定一个超时时间,超过这个时间如果没有接收到数据,就会抛出这个异常。 在描述中提到的博文链接指向了一个具体的博客文章...

    resteasy设置timeout

    RESTEasy本身并不直接提供设置请求超时的API,但我们可以利用Java的HttpURLConnection或者第三方库,如Apache HttpClient,来实现这个功能。例如,以下代码展示了使用HttpURLConnection设置连接超时和读取超时: ``...

    java版日历实现

    总结来说,实现一个Java版日历,主要涉及`java.util.Calendar`类或`java.time`包中的类,通过获取和设置日期属性,以及循环遍历日期来显示日历。同时,考虑用户交互和可能的扩展功能,可以使日历应用更加实用和完整...

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

    在Java中,实现串口通信通常会用到第三方库,如RXTX库或JSerialComm库。这些库为Java提供了访问串行端口的API,使得开发者可以方便地读写串口数据。RXTX库是一个开源的Java库,它提供了与操作系统交互的底层接口,...

    java利用delayedQueue实现本地的延迟队列

    this.time = System.nanoTime() + timeout; this.task = t; this.n = atomic.getAndIncrement(); } / * 返回与此对象相关的剩余延迟时间,以给定的时间单位表示 */ @Override public long getDelay...

    Java实现时间监听

    在Java中,我们可以使用`java.util.Timer`类、`java.util.TimerTask`类以及Java 8引入的`java.time`包中的接口来实现时间监听功能。下面将详细介绍这些方法。 1. **使用Timer和TimerTask** `java.util.Timer`类...

    Mikrotik RouterOS API的Java客户端库实现

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

    java实现DNS协议和SNTP协议

    在Java中,我们可以使用开源库如`com.github.fge:java-timezone-tools`来实现SNTP功能: ```java import com.github.fge.ntp.NTPClient; import com.github.fge.ntp.TimeResponse; TimeResponse response = new ...

    java实现的日期操作类

    标题提到的"java实现的日期操作类"通常指的是使用这些类来完成特定的日期计算任务,如获取星期几或计算未来的日期。 `java.util.Date`是Java早期用来表示日期和时间的类,但它的API设计并不理想,易用性较差。因此...

    java.util.TimeZone 的世界时区列表

    通过上述分析可以看出,`java.util.TimeZone`提供了丰富的时区信息,这对于实现跨时区的数据处理和时钟同步等功能至关重要。开发者可以根据实际需求选择合适的时区标识符,并利用Java提供的API进行时区相关的操作,...

    time_out_program.zip_Time_time out softwa

    4. **并发编程与线程**:在多线程环境中,可以使用Java的`Thread.sleep()`来模拟超时,或者使用`Future.get(long timeout, TimeUnit unit)`方法获取异步任务的结果,如果超时则抛出`TimeoutException`。 5. **...

    java控制台实现课程表

    Java 控制台实现课程表是一个基础的编程项目,它涵盖了数据结构、IO 流和对象序列化的知识。在这个项目中,我们将使用 Java 语言在控制台上创建一个简单的课程表系统,用户可以通过输入命令来实现对课程表的增、删、...

    java map 实现缓存技术

    例如,如果`timeOut`为30,则转换后表示缓存将在30秒后失效。 使用Java Map实现缓存,我们需要考虑以下几个关键点: 1. **缓存初始化**:创建Map实例,可以是HashMap、ConcurrentHashMap或其他适合并发访问的实现...

    java实现简单的留言板功能

    import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; public class MessageBoard { private String filePath = "messageboard.txt"; public void saveMessage(Message message...

    java每天实现定点执行任务java每天实现定点执行任务

    本文将详细探讨如何在Java中实现每天定点执行任务,主要涉及的核心知识点包括Java的定时框架如ScheduledExecutorService和Quartz Scheduler,以及如何配置任务定时器。 首先,`ScheduledExecutorService` 是Java...

    实现linux java ping 及traceroute 功能.rar

    本文将详细解析如何在Linux环境中利用Java语言实现`ping`和`traceroute`的功能,并结合C#的相关知识进行探讨。 首先,`ping`是一个简单但实用的网络工具,用于测试主机之间是否可达以及网络的延迟时间。在Linux中,...

    Java程序 实现 显示当前时间

    本篇文章将深入探讨如何通过Java程序实现显示当前时间的功能。 首先,Java标准库中的`java.util.Date`类是获取当前时间的基本方法。你可以创建一个Date对象,它会自动初始化为当前时间。例如: ```java import ...

    用Java多线程实现无阻塞读取远程文件

    public HttpReader(URL u, int connect_timeout, int read_timeout) { ... } // 获取内容长度 public static long getContentLength() { ... } // 读取数据 public int read(byte[] b, int off, int len) ...

    Java cache 实现

    key 是缓存的唯一标识符,value 是缓存的实际数据,timeOut 是缓存的超时时间,expired 是一个布尔值,表示缓存是否已经失效。 CacheManager 类 CacheManager 类是缓存管理器,负责管理缓存的创建、获取、删除和...

Global site tag (gtag.js) - Google Analytics