0

我有一个java程序,产生4线程。在每个线程中,我有多个套接字超时。但是,这些超时似乎不受尊重,即readLine()功能可能会阻塞较长时间。在Java中有多个线程不遵守套接字超时?

我想要以下行为:如果我将套接字超时设置为300毫秒,那么我希望readLine()函数在调用readLine()(即底层选择调用)后的300毫秒内返回,无论如何。我知道OS调度程序会在进行处理器共享时将线程置于睡眠状态,但是Java中是否有任何方式来强制线程始终被唤醒以确保这种行为?或者,这是不是在多线程编程时想的正确方法?理想情况下,由于我生成了4个线程并在6核机器上运行,因此每个线程都应该能够获得自己的CPU并行运行,并遵守选择的超时时间......但这可能太多了以期望...

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

+0

超过300毫秒的线程是否超时后返回的线程? – SimonJ 2011-05-03 00:12:52

回答

0

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

  • 的超时将完全为300ms。事实上,超时时间将至少为300ms。
  • OS调度程序在java线程中不执行任何操作(而不是调度java os进程)。
  • 拥有6个核心,并不意味着你的每个线程都会在单独的核心上运行,所以不可能在java
  • 上绑定thread-> core,因为你认为jvm只有你的4个线程运行,但实际上有更多的线程,例如垃圾收集器线程。

问你的问题:“有没有在Java中的任何方式来强制线程总是被唤醒,以确保这种行为” 是的,这取决于它如何是你的代码,如果线程是的Thread.Sleep (),您可以使用了Thread.interrupt()(一行readline()使用它),并办理InterruptionException或者如果他们的Object.wait(),您可以使用object.notify()object.notifyAll()

+0

感谢您的回答。但是,我正在寻找类似于上面所述的bacchus的信息。如果问题不明确,我表示歉意。 – user10 2011-05-03 14:26:47

1

如果我真的了解您的问题,您可以随时尝试在执行readLine()操作的线程中调用Thread.interrupt()。由于您没有提供任何代码,我留下这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命令相同,但您仍然无法保证此线程将在其他OS线程之前进行调度。

我希望这会有所帮助。

+0

感谢您的回复!我编辑了我的问题以便给出一些背景并使其更清楚(只是添加了一个PS)。我不想中止线程,但在线程内,我想确保在合理的时间内从某个函数调用返回。 – user10 2011-05-03 00:00:21

+1

@gveda你可以计算你在'readLine()'方法上花费的时间,然后'break'正在使用它的循环。这不太好,但我认为它解决了你的问题。 – bacchus 2011-05-03 00:23:25

+0

我最终做了类似的事情。我将初始超时设置为300,然后一旦我开始获取数据,就将超时设置为更小的值(50)。谢谢! – user10 2011-05-03 14:23:25