0

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

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

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

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

4

2 回答 2

1

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

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

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

我希望这有帮助。

于 2011-05-02T23:44:49.150 回答
0

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

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

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

于 2011-05-02T23:44:15.080 回答