When should I use SynchronousQueue

前端 未结 6 791
無奈伤痛
無奈伤痛 2020-12-22 17:46
new SynchronousQueue()
new LinkedBlockingQueue(1)

What is the difference? When I should use SynchronousQueue against LinkedBlock

6条回答
  •  误落风尘
    2020-12-22 18:12

    Synchronous queues are basically used for handoff purposes. They do not have any capacity and a put operation is blocked until some other thread performs get operation.

    If we want to safely share a variable between two threads, we can put that variable in synchrounous queue and let other thread take it from the queue.

    Code Sample from https://www.baeldung.com/java-synchronous-queue

        ExecutorService executor = Executors.newFixedThreadPool(2);
        SynchronousQueue queue = new SynchronousQueue<>();
    Runnable producer = () -> {
        Integer producedElement = ThreadLocalRandom
          .current()
          .nextInt();
        try {
            queue.put(producedElement);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    };
    
    Runnable consumer = () -> {
        try {
            Integer consumedElement = queue.take();
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    };
    
    executor.execute(producer);
    executor.execute(consumer);
    
    executor.awaitTermination(500, TimeUnit.MILLISECONDS);
    executor.shutdown();
    assertEquals(queue.size(), 0);
    

    They are also used in CachedThreadPool to achieve an effect of unlimited(Integer.MAX) thread creation as tasks arrive. CachedPool has coreSize as 0 and maxPoolSize as Integer.MAX with synchronous queue

    As tasks arrive onto queue, other tasks are blocked until the first one is fetched out. Since it does not have any queue capacity, thread pool will create one thread and this thread will take out task allowing more tasks to be put onto the queue. This will continue until thread creation reaches maxPoolSize. Based on timeOut, idle threads maybe terminated and new ones are created without crossing the maxPoolSize.

提交回复
热议问题