草庐IT

非阻塞

全部标签

java - Java阻塞线程占用CPU资源多吗?

我想问一下,当线程被阻塞时,Java是否会利用更多的CPU资源,即等待锁定当前正在被另一个线程锁定的监视器。我现在正在查看一个线程转储,其中一些线程在等待锁定监视器时被阻塞,我不确定这是否是导致高CPU使用率的原因。谢谢!编辑(2011年5月6日)我忘了提及此行为是否与JavaSE1.4.2相关。 最佳答案 线程消耗内存等资源。阻塞/解除阻塞线程会产生一次性成本。如果一个线程每秒阻塞/解除阻塞数万次,这会浪费大量的CPU。但是,一旦线程被阻塞,阻塞多长时间都没有关系,不会产生持续成本。

java - 如何自定义 BlockingQueue 的阻塞行为

我想创建一个阻塞队列,它根据自定义规则而不是队列中的项目数来阻塞生产者。例如:生产者生产一些文件并放入队列中。消费者经过一些分析后将它们转移到特定位置。对于上述场景,我希望生产者在队列中的总文件大小达到某个阈值时等待生成新文件。如果总大小不超过阈值,队列可以接受任意数量的文件。 最佳答案 我可能会将BlockingQueue子类化,例如ArrayBlockingQueue并添加一个简单的CountDownLatch,它被初始化为阈值并在达到0时启用各种take/remove方法。 关于j

java - 具有阻塞应用程序的 Tomcat NIO 连接器

在阅读了有关TomcatNIO连接器的信息后,我仍然不明白一件事:如果应用程序代码阻塞,nio连接器是否有益,即它在从数据库读取、读取文件系统、调用外部Web时阻塞服务?因此,例如,您有一个类似REST的API,它接收请求、从数据库读取内容并返回响应。它不使用servlet3async,它只是写入响应。我没有找到NIO连接器使用的线程池的完整描述,但我想它有一个线程池来处理请求,所以每个请求都在它自己的线程中结束,它可以阻塞。如果是这样,NIO的优势是否仍然存在,或者阻塞代码削弱了NIO的优势(在资源利用方面)? 最佳答案 Isth

java - 是否可以通过 Java NIO 非阻塞套接字异步访问数据库?

我想以非阻塞方式访问数据库,换句话说,我将通过一个套接字发送SQL请求,并通过同一个套接字异步读取查询响应。这意味着我只在套接字可用时从套接字读取数据(JavaNIOSocketChannel),所以我从不阻塞。我可能是错的,但据我所知,数据库的JDBC驱动程序都使用阻塞套接字。即使我必须执行一个返回100万行的查询,我也可以异步执行,在套接字缓冲区中可用时接收行。我的目标是在不阻塞的情况下执行SQL查询(即不产生延迟)。使用单独的线程不是一种选择。我需要在网络线程(NIO选择器线程)中执行此操作。有没有人成功做到这一点,或者可以推荐一种不涉及额外线程的方法?

java - 如何从标准输入非阻塞读取?

longend=System.currentTimeMillis()+60*10;InputStreamReaderfileInputStream=newInputStreamReader(System.in);BufferedReaderbufferedReader=newBufferedReader(fileInputStream);try{while((System.currentTimeMillis()我实际上尝试在600毫秒的时间内执行上述读取操作,之后它不应允许读取,但bufferedreader的readline正在阻塞。请帮忙 最佳答案

调用 select() 时,Java 线程在向选择器注册 channel 时阻塞。该怎么办?

我有一个基本问题。为什么以及如何SelectableChannel的register方法可以在阻塞调用。让我提供一个场景。我在Register类中创建了一个Selector对象,如下所示。privatestaticSelectorselector=Selector.open();我在同一个类(Register)中也有一个方法来向选择器注册channel。publicstaticSelectionKeyregisterChannel(SelectableChannelchannel,intops)throwsIOException{channel.configureBlocking(fa

【JAVA基础】- 同步非阻塞模式NIO详解

【JAVA基础】-同步非阻塞模式NIO详解文章目录【JAVA基础】-同步非阻塞模式NIO详解一、概述二、常用概念三、NIO的实现原理四、NIO代码实现客户端实现服务端实现五、同步非阻塞NIO总结一、概述NIO(Non-BlockingIO)是同步非阻塞方式来处理IO数据。服务器实现模式为一个请求一个线程,即客户端发送的链接请求都会注册到选择器上,选择器轮询到连接有IO请求时才启动一个线程进行处理。二、常用概念同步(synchronous):调用方式指应用(Application),调用方发起有一个功能调用时,在没有得到功能的结果之前,该调用不会返回。也就是说调用方会一直等待被调用方返回功能的结

java - 有界优先级阻塞队列

PriorityBlockingQueue是无界的,但我需要以某种方式对其进行绑定(bind)。实现这一目标的最佳方法是什么?有关信息,有界PriorityBlockingQueue将在ThreadPoolExecutor中使用。注意:通过bounded我不想在发生这种情况时抛出Exception,我想将对象放入队列中,然后根据其优先级值对其进行切割。有没有什么好的方法可以做到这一点? 最佳答案 我实际上不会将它子类化。虽然我现在无法将示例代码放在一起,但我建议使用装饰器模式的一个版本。创建一个新类并实现您感兴趣的类实现的接口(in

java - Java 中的非阻塞 UDP I/O 与阻塞 UDP I/O

NIO中的非阻塞TCP/IPSocketChannel和Selector帮助我用少量线程处理许多TCP/IP连接。但是UDPDatagramChannels怎么样?(我必须承认我对UDP不是很熟悉。)即使DatagramChannel未在阻塞模式下运行,UDP发送操作似乎也不会阻塞。是否真的存在DatagramSocket.send(DatagramPacket)由于拥塞或类似情况而阻塞的情况?我真的很好奇是否存在这种情况以及生产环境中可能存在的情况。如果DatagramSocket.send(DatagramPacket)实际上没有阻塞并且我不打算使用连接的DatagramSocke

java - 多个阻塞队列,单个消费者

我有多个包含要发送的消息的BlockingQueues。有没有可能有比队列更少的消费者?我不想遍历队列并继续轮询它们(忙等待),我也不希望每个队列都有一个线程。相反,我希望有一个线程在任何队列上有一条消息可用时被唤醒。 最佳答案 LinkedBlockingMultiQueue做你要求的。它不允许消费者阻塞任意BlockingQueues,但可以从单个“多队列”创建“子队列”并达到相同的效果。生产者在子队列中提供,消费者可以阻止自己轮询单个多队列,等待任何元素。它还支持优先级,即先从一些队列中取出元素,然后再考虑其他队列。例子:Li