`

不阻塞引起的大祸

 
阅读更多
在测试服务器上的时候 看到cpu一下到了 200%,然后检查问题,发现是由这样的代码引起的:

private ConcurrentLinkedQueue<PostMassage> postMassages = new ConcurrentLinkedQueue<PostMassage>();
...

public void run() {
      while (true) {
         PostMassage post =postMassages.peek();
         if(post!=null){
            ...
            postMassages.poll();
         }
         ...
      }
   }


从这个代码看,while循环会不断进行,就是在队列为空的情况下也是这样。这个的while操作是很迟cpu的。

解决的办法是采用阻塞的形式,这样:

...
sliceQueue = new LinkedBlockingQueue<byte[]>();
...
public void run() {
while(true) {
try {
data = sliceQueue.take();
                            ...
                     } catch(Exception e) {
                       ...
                     }
             }
      }


这个是阻塞的,而且加入了异常的处理,让这个更健壮。
看看take阻塞的原理,是采用了信号量,这个和wait notify是很类似的



 public E take() throws InterruptedException {
        E x;
        int c = -1;
        final AtomicInteger count = this.count;
        final ReentrantLock takeLock = this.takeLock;
        takeLock.lockInterruptibly();
        try {
                while (count.get() == 0) {
                    notEmpty.await();
                }
            x = dequeue();
            c = count.getAndDecrement();
            if (c > 1)
                notEmpty.signal();
        } finally {
            takeLock.unlock();
        }
        if (c == capacity)
            signalNotFull();
        return x;
    }
0
2
分享到:
评论

相关推荐

    Qt模式弹框不阻塞

    在Qt编程中,"Qt模式弹框不阻塞"是一个特定的设计模式,它允许开发者创建一个看似模态的对话框,但不会像传统模态对话框那样阻止用户与父窗口或其他窗口的交互。这种设计在某些场景下非常有用,比如在提供用户反馈或...

    交换机数据阻塞引起网络故障案例分析

    ### 交换机数据阻塞引起网络故障案例分析 #### 系统配置背景 在本案例中,涉及到的主要设备包括实达锐捷STAR-S1926G+交换机与清华同方超强1450L服务器。STAR-S1926G+是一款企业级的千兆以太网交换机,具有24个10/...

    阻塞线程池 阻塞线程池 阻塞线程池

    阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池...

    论文研究 - 浮屑堵塞引起的回水影响的决定性参数

    由碎屑堵塞引起的回水影响的尺寸分析导致在形成碎屑堵塞之前的初始情况下进场流量的弗洛德数和碎屑密度作为决定性参数。 为了更精确地检测这两个参数的影响,慕尼黑技术大学液压与水资源工程实验室的不同水力模型...

    阻塞通信和非阻塞通信的区别

    | 线程状态 | 被阻塞 | 不被阻塞 | | 事件处理 | 等待事件完成 | 可以继续执行其他操作 | | 应用场景 |适用于实时系统 | 适用于高性能系统 | 在实际应用中,阻塞通信和非阻塞通信都有其优缺点,需要根据实际情况...

    QTcpSocket通信编程时阻塞与非阻塞的问题 - findumars - 博客园1

    QTcpSocket是Qt库中的一个类,用于处理TCP(传输控制协议)套接字通信。...而对于简单且对实时性要求不高的应用,阻塞模式则相对易于实现。了解和掌握这两种模式及其转换方法是开发高质量网络应用的关键。

    通信与网络中的有关GPS信号阻塞引起的EKF算法改进

    引言  随着科技的发展,因为应用的广泛GPS是被我们所熟知的一项技术。GPS就是通过接受卫星信号,进行定位或者导航的终端。而接受信号就必须用到天线。 GPS卫星信号分为L1和L2,频率分别为1575.42MHZ和1228MHZ,...

    gtornado 使tornado支持调用阻塞IO时不阻塞

    在实际应用中,`gtornado` 可以用于优化数据库访问、文件读写、网络请求等可能引起阻塞的操作。例如,如果一个 `tornado` 应用需要用到 MySQL 数据库,通常的数据库驱动(如 `pymysql`)会进行阻塞 I/O,这时可以...

    Linux UDP socket 设置为的非阻塞模式与阻塞模式区别

    - **非阻塞模式**:与此相反,在非阻塞模式下,如果执行I/O操作的条件不满足,则立即返回一个错误码或特定值,而不是挂起进程。 #### 三、UDP Socket 模式详解 ##### 3.1 UDP Socket 的阻塞模式 在阻塞模式下,UDP ...

    android开发串口,修改串口为非阻塞模式

    这样,如果在没数据返回的情况,线程将不能安全退出。缺陷之二是:没有停止位、奇偶校验位,停止位的设置。缺陷之三是:如果退出串口通讯后,下位机可能会在此发送信息到端口,下次马上进入时,会有上次残留数据。 ...

    C#多线程不阻塞

    它允许调用者在不等待函数执行完毕的情况下继续执行其他任务,实现所谓的"并发"执行。在C#中,我们可以使用委托(如`MethodInvoker`)和`BeginInvoke()`来实现异步调用。如上文所示,通过`BeginInvoke()`调用`Foo()`...

    同步异步阻塞非阻塞

    非阻塞 IO 的特点是用户进程可以继续执行其他任务,而不需要等待数据准备好。但是,非阻塞 IO 需要不断地轮询 kernel,以检查数据是否准备好,这可能会增加 CPU 的负载。 3. IO 多路复用(IO Multiplexing) IO 多...

    数据库阻塞/死锁检查处理方法

    当应用服务器发生阻塞时,特别是在集群环境中,应先检查数据库,以判明应用服务器阻塞是否由数据库阻塞引起。可以按照以下步骤进行检查: 1. 查看 `dba_waiters` 表中的记录,如果有输出,转到阻塞情形 A。 2. 如果...

    C++ socket 阻塞与非阻塞

    本话题主要探讨的是在C++ Socket编程中的阻塞模式与非阻塞模式,以及它们在多线程环境下的应用和资源管理。 一、阻塞与非阻塞模式 1. **阻塞模式**:在阻塞模式下,当一个Socket调用(如recv或send)执行时,如果...

    CVDC立式干井式不堵塞泵.pdf

    CVDC立式干井式不堵塞泵pdf,CVDC立式干井式不堵塞泵

    Verilog里阻塞与非阻塞的区别

    * 阻塞赋值在赋值过程中不允许其他 Verilog 语句的干扰,非阻塞赋值允许其他 Verilog 语句同时计算 RHS 表达式和更新 LHS * 阻塞赋值的执行是一个步骤的操作,非阻塞赋值的执行可以看作是两个步骤的操作 * 在编程时...

    httplib库实现非阻塞式监听

    在IT行业中,网络编程是不可或缺的一部分,特别是在开发服务器应用程序时。`httplib`是一个流行的C++库,用于创建HTTP服务器和客户端。这个库为开发者提供了简单而强大的接口,以处理HTTP请求和响应。当我们提到“非...

    异步 同步 阻塞 非阻塞 的说明_异步同步阻塞非阻塞_

    阻塞(Blocking)是指在进行某项操作时,如果所需的资源不可用,那么调用者会被挂起,无法执行其他任务,直到资源可用。比如,当一个线程尝试读取一个尚未准备好的文件时,它会被阻塞,直到文件数据准备好。阻塞操作...

    深入理解Verilog阻塞非阻塞

    - 在复杂的时序逻辑设计中,过度使用阻塞赋值可能会导致时序错误,因为这种赋值方式不考虑时钟边沿。 - 在编写模块化、可重用的代码时,尽可能使用非阻塞赋值,以保持代码的一致性和易于理解性。 总之,在使用...

    C++串口通信类(阻塞和非阻塞都支持)

    在这个主题中,我们将深入探讨如何使用C++构建一个支持阻塞和非阻塞模式的串口通信类。 串口通信的基本概念: 串口通信是指通过串行接口进行的数据传输,通常涉及RS-232、RS-485或USB等标准。数据以比特流的形式逐...

Global site tag (gtag.js) - Google Analytics