java调优设置阻塞队列大小

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java调优设置阻塞队列大小相关的知识,希望对你有一定的参考价值。

阻塞队列大小的调整是Java调优的一个重要环节,它可以帮助减少内存的使用,提升程序的运行效率。Java调优时,首先要考虑的是阻塞队列大小的设置。根据不同的应用场景,可以选择不同大小的队列,有效地调整系统性能。例如,如果应用程序的任务量较大,就要选择增大阻塞队列的大小,以减少任务的等待和拥塞情况;如果应用程序的任务量少,则可以选择减小队列的大小,以节省内存的使用。 参考技术A 调优设置阻塞队列大小可以通过修改系统参数来实现。例如,可以设置最大线程数、最大队列大小、最大空闲时间、最小线程数等等。此外,也可以通过修改Java虚拟机参数,如线程池的核心线程数和最大线程数,来改变阻塞队列的大小。

阻塞队列LinkedBlockQueue

一、简介 

Java提供了FIFO先进先出的阻塞队列实现,这其实是一种生产者消费者理念,可以通过阻塞队列将生产者和消费者进行解耦合。

LinkedBlockQueue是一种无界队列,但事实上它只是队列可容纳的最大值很大。通常,我们为了防止特殊情况,都会给队列设置一个边界。

JDK文档:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/concurrent/LinkedBlockingQueue.html

二、示例

以下示例,包括:

1)offer:向队列尾部提交元素。

offer和put很类似,但put会一直阻塞直到可用或者异常

2)poll:获取并移除队列头部元素。

poll和take类似,但take仅支持持续阻塞,poll可以选择超时时间。

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class BlockQueueDemo {

    private BlockingQueue<String> userQueue = new LinkedBlockingQueue<>();

    private void offer() {
        // 每1秒钟,offer一条数据
        for (int i = 0; i < 10; i++) {
            int id = i;
            new Thread(() -> {
                userQueue.offer("user: ID=" + id);
            }).start();
            System.out.println("offered");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private void poll() {
        // 每1秒钟,poll一条数据
        for (int i = 0; i < 10; i++) {
            int id = i;
            new Thread(() -> {
                String user = userQueue.poll();
                System.out.println(user);
            }).start();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        BlockQueueDemo queueDemo = new BlockQueueDemo();
        queueDemo.offer();
        queueDemo.poll();
    }
}

 

以上是关于java调优设置阻塞队列大小的主要内容,如果未能解决你的问题,请参考以下文章

阻塞队列

JUC并发编程--- 阻塞队列和同步队列使用

阻塞队列LinkedBlockQueue

java condition 实现简单的阻塞队列

java阻塞队列 线程同步合作

Java 阻塞队列