美文网首页多线程
线程安全8 - 可阻塞的队列

线程安全8 - 可阻塞的队列

作者: 小超_8b2f | 来源:发表于2019-09-29 11:06 被阅读0次
  • 队列包含固定长度的队列和不固定长度的队列
  • 什么是阻塞队列,阻塞队列的作用与实际应用,阻塞队列的实现原理
  • ArrayBlockingQueue
    • 看BlockingQueue类的帮助文档,其中有各个方法的区别对比表格
    • 只有put方法和take方法才具有阻塞功能
  • 用3个空间的队列来演示阻塞队列的功能和效果。
  • 用2个只有一个空间的队列来实现同步通知的功能
  • 阻塞队列与Semaphore类似,但也不同,阻塞队列是一方存放数据,另一方释放数据,Semaphore通常则是由同一方设置和释放信号量
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class BlockQueueTest {

    public static void main(String[] args) {
        final Business3 business = new Business3();
        new Thread(new Runnable() {
            @Override
            public void run() {
                //子线程循环调用50次某逻辑
                for(int i = 0; i < 50; i++) {
                    business.sub(i);
                }
            }
        }).start();
        
        //主线程循环调用50次某逻辑
        for(int i = 0; i < 50; i++) {
            business.main(i);
        }
    }
}

class Business3 {
    BlockingQueue<Integer> queue1 = new ArrayBlockingQueue<>(1);
    BlockingQueue<Integer> queue2 = new ArrayBlockingQueue<>(1);
    
    {
        try {
            queue2.put(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    public void sub(int i) {
        try {
            queue1.put(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for (int j = 0; j < 10; j++)
            System.out.println("sub Thread run sequece of " + j + " loop of " + i);
        
        try {
            queue2.take();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    public void main(int i) {
        try {
            queue2.put(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for (int j = 0; j < 10; j++)
            System.out.println("main Thread run sequece of " + j + " loop of " + i);
        
        try {
            queue1.take();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

相关文章

  • 线程安全8 - 可阻塞的队列

    队列包含固定长度的队列和不固定长度的队列 什么是阻塞队列,阻塞队列的作用与实际应用,阻塞队列的实现原理 Array...

  • c++ 实现 blocking queue

    阻塞队列就是多线程线程安全的队列,在多线程场景下经常用到,c++ 标准库里面没有提供阻塞队列,boost 中有提供...

  • java并发容器-BlockingQueue

    线程安全的阻塞队列,用来处理 生产者-消费者 问题。当队列容器满时,生产者线程被阻塞直到队列未满。当队列容器为空时...

  • 队列BlockingQueue

    LinkedBlockingQueue:阻塞队列 是一种单向阻塞链表,是线程安全的队列。先进先出,可以指定最大容量...

  • java源码-ArrayBlockingQueue

    开篇  ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。 线程安全是指ArrayBloc...

  • Java 阻塞队列

    简介 java 的阻塞队列是应用在多线程中,尤其适合生产者和消费者模式,阻塞队列支持阻塞操作,线程安全,已经实现了...

  • Java 数据结构—阻塞队列学习笔记

    特点 阻塞队列 BlockingQueue 是线程安全,所有的操作都加了锁。 阻塞你是怎么理解的呢? 队列主要的操...

  • Java 队列之BlockingQueue

    BlockingQueue提供了可阻塞的插入和移除的方法。当队列容器已满,生产者线程会被阻塞,直到队列未满;当队列...

  • Java多线程系列--“JUC集合”之 ArrayBlockin

    ArrayBlockingQueue介绍 ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列...

  • LinkedBlockingQueue

    一、LinkedBlockingQueue是什么?LinkedBlockingQueue是一个线程安全的阻塞队列,...

网友评论

    本文标题:线程安全8 - 可阻塞的队列

    本文链接:https://www.haomeiwen.com/subject/nlacyctx.html