20、JUC:同步队列-SynchronousQueue

学习过程观看视频:[狂神说Java]
https://www.bilibili.com/video/BV1B7411L7tE?p=13
欢迎大家支持噢,很良心的老师了!

同步队列-SynchronousQueue解释:

在这里插入图片描述

java代码示例:

package com.add;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;

/**
 * Created by zjl
 * 2020/11/25
 **/
public class SynchronousQueueTest {
    
    

    public static void main(String[] args) {
    
    

        BlockingQueue<String> blockingQueue = new SynchronousQueue<>();

        new Thread(()->{
    
    
            try {
    
    
                System.out.println(Thread.currentThread().getName() + "put  1");
                blockingQueue.put("1");
                System.out.println(Thread.currentThread().getName() + "put  2");
                blockingQueue.put("2");
                System.out.println(Thread.currentThread().getName() + "put  3");
                blockingQueue.put("3");
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        },"放入线程").start();

        new Thread(()->{
    
    
            try {
    
    
                TimeUnit.SECONDS.sleep(1);
                System.out.println(Thread.currentThread().getName() + "=======》" + blockingQueue.take());
                TimeUnit.SECONDS.sleep(1);
                System.out.println(Thread.currentThread().getName() + "=======》" + blockingQueue.take());
                TimeUnit.SECONDS.sleep(1);
                System.out.println(Thread.currentThread().getName() + "=======》" + blockingQueue.take());
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        },"取出线程").start();


    }

}

输出结果:

放入线程put  1
取出线程=======1
放入线程put  2
取出线程=======2
放入线程put  3
取出线程=======3

解释说明:

根据上面的代码示例,第一个线程会在第二个线程取之前全部都放进队列才对,因为第二条队列我们进行了睡眠1s,这段时间足以让第一个线程将所有数据放入队列,但是结果并不是这样,而是先放进去一个对象,取出一个对象之后再次放入一个对象,说明我们的同步队列里面只能存放一个对象。

猜你喜欢

转载自blog.csdn.net/qq_41347385/article/details/110124101
今日推荐