Java - SynchronousQueue学习使用

2021-01-06 15:37:34 浏览数 (1)

SynchronousQueue叫同步队列,它与其他队列的不同之处是生产put与消费take都是阻塞操作,当生产的元素没有被消费时进行阻塞,当队列中没有可消费的元素时阻塞,这种同步队列的机制也叫作配对通信机制。 它与其他队列的不同之处还在于没有使用AQS维护内部容器,全部使用CAS进行处理。

1. 使用

代码语言:javascript复制
public class SynchronousQueueTest {

    static SynchronousQueue<Object> queue = new SynchronousQueue<>();

    public static void main(String[] args) throws InterruptedException {
        new Thread(new MyThread()).start();
        new Thread(new MyThread()).start();
        Thread.sleep(2000);
        queue.take();
        System.out.println("take1");
        queue.take();
        System.out.println("take2");
    }

    public static class MyThread implements Runnable{

        @Override
        public void run() {
            try {
                System.out.println(Thread.currentThread().getName()   " - 阻塞...");
                queue.put("a");
                System.out.println(Thread.currentThread().getName()   " - 阻塞结束...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 输出
代码语言:javascript复制
out => 
Thread-0 - 阻塞...
Thread-1 - 阻塞...
take1
Thread-1 - 阻塞结束...
Thread-0 - 阻塞结束...
take2

0 人点赞