繁体   English   中英

Java 中的多个线程不遵守套接字超时?

[英]Socket timeout not respected with multiple threads in Java?

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

我想要以下行为:如果我将套接字超时设置为 300 毫秒,那么我希望readLine() function 在调用readLine() (即底层 select 调用)后 300 毫秒内返回,无论如何。 我知道操作系统调度程序会在进行处理器共享时使线程进入睡眠状态,但是 Java 中是否有任何方法可以强制线程始终被唤醒以确保这种行为? 还是在进行多线程编程时这不是正确的思考方式?

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

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

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

这两个链接也可能对你有用: 你如何在 Java 中杀死一个线程? 以及如何在 java 中以快速干净的方式中止线程? .

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

我希望这有帮助。

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

  • 超时将恰好是 300 毫秒。 事实上,超时时间至少为 300 毫秒。
  • 操作系统调度程序在 java 线程内不做任何事情(而不是调度 java 操作系统进程)。
  • 有 6 个核心,并不意味着您的每个线程都将在单独的核心上运行,不可能在 java 处绑定线程->核心
  • 最后,您认为 jvm 只有您的 4 个线程在运行,但实际上还有更多线程,例如垃圾收集器线程。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM