草庐IT

阻塞性

全部标签

java - BufferedInputStream 和阻塞

我正在使用BufferedInputStream从套接字中读取数据。BufferedInputStream内容如下:socketInput.read(replyBuffer,0,7);它被实例化socketInput=newBufferedInputStream(mySocket.getInputStream());mySocket被定义为privateSocketmySocket;mySocket由mySocket=newSocket(ipAddress,port);实例化我已验证mySocket已连接到我的设备。我可以向我的设备发送数据;但是,由于未知原因,我没有从我的设备接收到信

java Process.waitfor 是一个阻塞调用

我希望能够从JVM内部启动外部进程并完成它。我可以使用ProcessBuilder创建一个流程,然后执行Process.waitFor()以等待其完成。然而,这是一个阻塞调用,只会浪费线程资源。通过事件处理程序和响应式编程来完成此操作会更有意义。人们会认为JVM可以向操作系统注册某种监听器来监听进程完成事件,并将其转发回程序。是否存在这样的机制/API?有没有实现此目的的替代方案或库? 最佳答案 使用NuProcess如果您只需要支持Windows、MacOSX和Linux,请使用该库。它使用回调模型提供对外部进程的非阻塞访问——包

java - 为什么 java 的 inputstream.close() 会阻塞?

我的Java程序使用ProcessBuilder(将redirectErrorStream设置为true)并有一个循环来运行进程的输入流的读取方法,这是阻塞的。然后我调用的外部程序停止等待输入和标准输入。我现在想杀死这个过程。这不是通过(在单独的线程中)调用进程的destroy方法,并调用inputstream的close方法来停止read方法阻塞来完成的,这样我的初始线程就可以结束它的生命了吗?由于某些原因process.getInputStream().close()block。从JavaDoc我不明白为什么会发生这种情况。此外,我不明白为什么javadoc说“InputStrea

Java 并发 - 应该阻塞还是让步?

我有多个线程,每个线程都有自己的私有(private)并发队列,它们所做的只是运行一个无限循环,从中检索消息。可能有一个队列在一段时间内(可能几秒钟)没有收到消息,而且它们可能会大量涌入,因此需要快速处理。我想知道在第一种情况下最适合做什么:使用阻塞队列并阻塞线程直到我有更多输入或执行Thread.yield()?我希望在给定时间有尽可能多的CPU资源可用,因为并发线程的数量可能会随着时间的推移而增加,但我也不希望消息处理落后,因为无法保证当执行yield()时线程将被重新安排执行。我知道硬件、操作系统和其他因素在这里起着重要作用,但抛开这些并从Java(JVM?)的角度来看,什么是最

连接到服务器时 Java 套接字阻塞

我正在尝试使用Java套接字连接到服务器。我正在尝试从端口80连接到90intport;Socketclientsocket;Stringhostname="www.google.com";for(port=80;port当我尝试连接到任何网站(如google.com或w3schools.com)时,我的程序在socket()调用端口号(80除外)时挂起。由于这些网站不在端口81-90上提供服务,因此它应该引发异常,但它却被阻止了。对于端口80,它工作正常。当我尝试连接到安装在我机器上的apache服务器时,它不会阻止任何端口号并给我连接拒绝错误,这是显而易见的行为。那么为什么会这样。

java - ExecutorService,如何在不阻塞主线程的情况下知道所有线程何时完成?

我有一个多线程实现,我在其中创建一个ExecutorService并提交要执行的任务,我想知道所有线程何时提交都已完成而不阻塞主线程和UI。我试过ExecutorService.awaitTermination()但它会阻塞主线程和UI。我搜索了很多,但我似乎无法找到一种优雅的方式来做到这一点。我目前正在考虑创建另一个线程来计算已完成线程的数量并在它们全部完成时启动一个事件,但这不是一个好方法,我想要一个更好的解决方案! 最佳答案 使用SwingWorker关闭线程池并调用awaitTermination()。这将防止UI阻塞并从您

java - 并发/非阻塞控制台键盘输入

我正在用Java开发MUD。我每次都读取播放器输入,但我使用的是Scanner,它使用阻塞操作。我想要非阻塞输入。我看过nio包,它有一个Selector类,但我不确定如何将它用于System.in。我想一旦我运行服务器我肯定会需要它,但现在一切都处于离线状态。我已经尝试从Applet扩展主类并覆盖keyDown,但这只是意味着在第一个输入之后不再接受输入。当然,我不再阻止任何东西,但是没有更多的输入。keyDown我猜再也没有被调用过。也许线程即使在执行阻塞操作时也可以被中断?感谢您对此问题的任何见解。 最佳答案 你不能用系统控制

java - Tomcat 6.0.28 在浸泡测试期间由于线程阻塞而无响应

我们对在Tomcat6.0.28和OpenJDK运行时环境(IcedTea61.11.11)上运行的新版JavaEEWeb应用程序进行了多次浸泡测试。问题出现在web层。一段时间后-第一次50分钟,第二次1小时,第三次2.5小时-我们集群Web层中的一个随机Tomcat停止响应。查看线程转储,我们看到大量线程突然阻塞。当问题发生时,线程数从93增加到437。437个线程中的341个在WebappClassLoader上被阻塞,如下所示:"TP-Processor400"daemonprio=10tid=0x00007f1ee432e800nid=0x44d9waitingformoni

java - 修复了线程池线程阻塞,当提交了足够多的任务时

我有一个流程需要并行计算许多小任务,然后按任务的自然顺序处理结果。为此,我进行了以下设置:一个简单的ExecutorService和一个阻塞队列,当Callable提交给执行程序时,我将使用它来保持返回的Future对象:ExecutorServiceexec=Executors.newFixedThreadPool(15);LinkedBlockingQueue>futures=newLinkedBlockingQueue>(15*64);一些调试代码,用于计算提交的数量和已处理的任务数量,并定期将它们写出来(注意processed在任务代码本身的末尾递增):AtomicLongpr

Java Serializable、ObjectInputstream、非阻塞 I/O

我刚刚开始使用Java序列化,我不清楚在非阻塞I/O的情况下您应该如何从源获取对象。我能找到的所有文档都建议使用ObjectInputStream是读取序列化对象的正确方法。但是,正如我提到的,我正在使用java.nio并执行非阻塞操作。如果readObject()将阻塞直到有新对象可用,这对我没有帮助总结..使用JavaNIO时如何进行序列化? 最佳答案 将序列化实例包装在一个报告有效负载长度的协议(protocol)中,有效负载就是所讨论的实例。然后,一旦您知道您有一个表示完整实例的段,您就可以安全地使用ObjectInputS