Java中的多个线程不支持套接字超时?

时间:2011-05-02 23:29:20

标签: java multithreading sockets select socket-timeout-exception

我有一个java程序,可以生成4个线程。在每个线程中,我有多个套接字超时。但是,似乎没有遵守这些超时,即readLine()功能可能会阻塞更长的时间。

我想要以下行为:如果我将套接字超时设置为300毫秒,那么我希望readLine()函数在readLine()(即基础选择调用)之后的300毫秒内返回无论如何都会被调用。我知道操作系统调度程序会在执行处理器共享时将线程置于休眠状态,但在Java中是否有任何方法可以强制线程始终被唤醒以确保此行为?或者这是不是在进行多线程编程时思考的正确方法?

理想情况下,由于我正在产生4个线程并在6核机器上运行,因此每个线程应该能够获得自己的CPU并且并行运行,并且尊重选择超时......但这可能太多了期待......

PS:我实际上使用Thread.interrupt()来确保我的每个线程在一定时间内退出(我检查主线程中经过的时间,如果它太长则中断子线程)。在我的每个线程中,我连接到(不同的)服务器,发出请求,并等待响应。我不知道答复会持续多久。所以我继续调用readLine()方法,直到它超时SocketTimeoutException。我强制执行300毫秒的超时,因为我希望服务器在这段时间内开始响应。我想强制执行此超时的原因是服务器以广播方式运行,并将单个客户端对请求的响应发送给所有客户端。因此,如果我没有超时,我将继续获取数据以响应其他客户的请求。

2 个答案:

答案 0 :(得分:1)

如果我真的了解您的问题,您可以尝试在执行Thread.interrupt()操作的线程中调用readLine()。由于您没有提供任何代码,我将此link留给您阅读。它是通用的,但它提供了有关中断线程的足够信息。

这两个链接也可能对您有用:How do you kill a thread in Java?How to abort a thread in a fast and clean way in java?

关于操作系统调度程序的问题,您应该知道,在通用操作系统中,您无法完全控制操作系统调度任务的方式。例如,在Linux中,中断是优先级最高的任务,然后存在调度策略,使您能够对任务的调度方式进行“某种”决定。在Java中,您可以使用setPriority()方法来更改线程的优先级,但实际上它与使用nice命令相同,但您仍然无法保证此线程将在其他操作系统线程之前安排。

我希望这会有所帮助。

答案 1 :(得分:0)

你在这里做了一些错误的假设:

  • 超时将是300毫秒。事实上,超时将至少为300毫秒。
  • OS Scheduler在java线程中没有做任何事情(而不是安排java os进程)。
  • 拥有6个核心,并不意味着你的每个线程都将在不同的核心运行,不可能在java上绑定thread->核心
  • 最后,您认为jvm只运行了4个线程,但实际上有更多的线程,例如垃圾收集器线程。

问你的问题:“Java中是否有任何方法可以强制线程始终被唤醒以确保这种行为?” 是的,根据你的代码如何,如果线程是 thread.sleep(),你可以使用thread.interrupt()(对于readline()使用它)并处理 InterruptionException < / em>或者如果它们是 object.wait(),则可以使用 object.notify() object.notifyAll()。< / p>