SynchronousQueue的简单应用1

傷城~ 2022-04-04 08:46 306阅读 0赞

使用jdk的原话:

一种阻塞队列,其中每个 put 必须等待一个 take,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。不能在同步队列上进行 peek,因为仅在试图要取得元素时,该元素才存在;除非另一个线程试图移除某个元素,否则也不能(使用任何方法)添加元素;也不能迭代队列,因为其中没有元素可用于迭代。队列的 是尝试添加到队列中的首个已排队线程元素;如果没有已排队线程,则不添加元素并且头为 null。对于其他 Collection 方法(例如 contains),SynchronousQueue 作为一个空集合。此队列不允许 null 元素。

同步队列类似于 CSP 和 Ada 中使用的 rendezvous 信道。它非常适合于传递性设计,在这种设计中,在一个线程中运行的对象要将某些信息、事件或任务传递给在另一个线程中运行的对象,它就必须与该对象同步。

对于正在等待的生产者和使用者线程而言,此类支持可选的公平排序策略。默认情况下不保证这种排序。但是,使用公平设置为 true 所构造的队列可保证线程以 FIFO 的顺序进行访问。公平通常会降低吞吐量,但是可以减小可变性并避免得不到服务。

  1. import java.util.Random;
  2. import java.util.concurrent.SynchronousQueue;
  3. import java.util.concurrent.TimeUnit;
  4. public class Test18 {
  5. public static void main(String[] args) throws InterruptedException {
  6. final SynchronousQueue<Integer> queue = new SynchronousQueue<Integer>();
  7. new Thread(new Runnable(){
  8. @Override
  9. public void run() {
  10. try {
  11. System.out.println("等待数据传入...");
  12. System.out.println("##获取的数据为:"+queue.take());
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. }
  16. }}
  17. ).start();
  18. TimeUnit.SECONDS.sleep(3);//三秒之后传入数据
  19. System.out.println("准备传入数据..");
  20. queue.offer(new Random().nextInt(1000));
  21. }
  22. /**
  23. * 运行结果:
  24. * 等待数据传入...//在这里等待了三秒
  25. 准备传入数据..
  26. ##获取的数据为:194
  27. */
  28. }

发表评论

表情:
评论列表 (有 0 条评论,306人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SynchronousQueue简单1

    使用jdk的原话: 一种阻塞队列,其中每个 put 必须等待一个 take,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。不能在同步队列上进行 peek,因