【问题标题】:How to implement a multi-threaded timer task in java?如何在java中实现多线程定时器任务?
【发布时间】:2015-05-24 09:19:29
【问题描述】:

我要做的工作是在java中模拟一个停止等待的ARQ。初始设置是

  1. 创建ServerSocket
  2. 对于每个接受的客户端,使用 ServerSocket.accept 为该客户端创建一个新线程。

现在,我基本上要做的主要部分。

  1. 向客户端发送数据包。 (或一些数据给客户)
  2. 等待 1 秒,但如果在该时间内收到确认,则中断等待期并进入下一个循环

    List<String> frames = frame.getFrames(Server.getData());
    for(int i=0;i<frames.size();++i)
    {
        String currFrame = frames.get(i);
        writer.println(currFrame); // A printwriter for socket
        writer.flush();
        if(reader.readline()) // for 1 sec
        /** 
            Here is what I want to do. I want to keep reading for input upto 1 sec.
            if No input is found after even after 1 sec. Decrement i and go to the 
            start of the loop
       **/
    
    }
    

    这里的问题是,这个阅读器是一个阻塞代码,直到输入可用。但我想要的是,如果 1 秒后读者没有找到输入,它会跳出循环。而且我们必须注意到这段代码是在一个单独的线程中。

那么,这个问题有什么巧妙的解决方案吗? here 是完整的代码。

【问题讨论】:

  • 阅读Socket.setSoTimeout()的文档。
  • 你也可以通过 NIO 尝试非阻塞、基于事件的 IO。这样,计时器和读取将只是两种不同类型的事件。

标签: java multithreading sockets client-server


【解决方案1】:

你需要设置SoTimeut:

    ServerSocket socket = new ServerSocket(somePort);

    Socket incoming = socket.accept();
    incoming.setSoTimeout(1000);

【讨论】:

  • 所以,我必须在时间用完时捕获异常?对吗?
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 2010-12-09
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多