diff --git a/core-java-modules/core-java-concurrency-collections-2/pom.xml b/core-java-modules/core-java-concurrency-collections-2/pom.xml
index 65a91c9a9c..7fdd348dc5 100644
--- a/core-java-modules/core-java-concurrency-collections-2/pom.xml
+++ b/core-java-modules/core-java-concurrency-collections-2/pom.xml
@@ -23,7 +23,12 @@
jmh-generator-annprocess
${jmh.version}
-
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
src
@@ -42,6 +47,8 @@
1.21
28.2-jre
+
+ 3.6.1
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/TestConcurrentLinkedQueue.java b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/TestConcurrentLinkedQueue.java
new file mode 100644
index 0000000000..c61becc366
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/TestConcurrentLinkedQueue.java
@@ -0,0 +1,66 @@
+package com.baeldung.concurrent.queue;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+
+@FixMethodOrder
+public class TestConcurrentLinkedQueue {
+
+ @Test
+ public void givenThereIsExistingCollection_WhenAddedIntoQueue_ThenShouldContainElements() {
+ Collection elements = Arrays.asList(1, 2, 3, 4, 5);
+ ConcurrentLinkedQueue concurrentLinkedQueue = new ConcurrentLinkedQueue<>(elements);
+ assertThat(concurrentLinkedQueue).containsExactly(1, 2, 3, 4, 5);
+ }
+
+ @Test
+ public void givenQueueIsEmpty_WhenAccessingTheQueue_ThenQueueReturnsNull() throws InterruptedException {
+ ExecutorService executorService = Executors.newFixedThreadPool(1);
+ ConcurrentLinkedQueue concurrentLinkedQueue = new ConcurrentLinkedQueue<>();
+ executorService.submit(() -> assertNull("Retrieve object is null", concurrentLinkedQueue.poll()));
+ TimeUnit.SECONDS.sleep(1);
+ executorService.awaitTermination(1, TimeUnit.SECONDS);
+ executorService.shutdown();
+ }
+
+ @Test
+ public void givenProducerOffersElementInQueue_WhenConsumerPollsQueue_ThenItRetrievesElement() throws Exception {
+ int element = 1;
+
+ ExecutorService executorService = Executors.newFixedThreadPool(2);
+ ConcurrentLinkedQueue concurrentLinkedQueue = new ConcurrentLinkedQueue<>();
+ Runnable offerTask = () -> concurrentLinkedQueue.offer(element);
+
+ Callable pollTask = () -> {
+ while (concurrentLinkedQueue.peek() != null) {
+ return concurrentLinkedQueue.poll()
+ .intValue();
+ }
+ return null;
+ };
+
+ executorService.submit(offerTask);
+ TimeUnit.SECONDS.sleep(1);
+
+ Future returnedElement = executorService.submit(pollTask);
+ assertThat(returnedElement.get()
+ .intValue(), is(equalTo(element)));
+ executorService.awaitTermination(1, TimeUnit.SECONDS);
+ executorService.shutdown();
+ }
+}
diff --git a/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/TestLinkedBlockingQueue.java b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/TestLinkedBlockingQueue.java
new file mode 100644
index 0000000000..7a78bc7b3b
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrent/queue/TestLinkedBlockingQueue.java
@@ -0,0 +1,81 @@
+package com.baeldung.concurrent.queue;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+
+@FixMethodOrder
+public class TestLinkedBlockingQueue {
+
+ @Test
+ public void givenThereIsExistingCollection_WhenAddedIntoQueue_ThenShouldContainElements() {
+ Collection elements = Arrays.asList(1, 2, 3, 4, 5);
+ LinkedBlockingQueue linkedBlockingQueue = new LinkedBlockingQueue<>(elements);
+ assertThat(linkedBlockingQueue).containsExactly(1, 2, 3, 4, 5);
+ }
+
+ @Test
+ public void givenQueueIsEmpty_WhenAccessingTheQueue_ThenThreadBlocks() throws InterruptedException {
+ ExecutorService executorService = Executors.newFixedThreadPool(1);
+ LinkedBlockingQueue linkedBlockingQueue = new LinkedBlockingQueue<>();
+ executorService.submit(() -> {
+ try {
+ linkedBlockingQueue.take();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ });
+ TimeUnit.SECONDS.sleep(1);
+ executorService.awaitTermination(1, TimeUnit.SECONDS);
+ executorService.shutdown();
+ }
+
+ @Test
+ public void givenProducerPutsElementInQueue_WhenConsumerAccessQueue_ThenItRetrieve() {
+ int element = 10;
+ ExecutorService executorService = Executors.newFixedThreadPool(2);
+ LinkedBlockingQueue linkedBlockingQueue = new LinkedBlockingQueue<>();
+ Runnable putTask = () -> {
+ try {
+ linkedBlockingQueue.put(element);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ };
+
+ Callable takeTask = () -> {
+ try {
+ return linkedBlockingQueue.take();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ return null;
+ };
+
+ executorService.submit(putTask);
+ Future returnElement = executorService.submit(takeTask);
+ try {
+ TimeUnit.SECONDS.sleep(1);
+ assertThat(returnElement.get()
+ .intValue(), is(equalTo(element)));
+ executorService.awaitTermination(1, TimeUnit.SECONDS);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ executorService.shutdown();
+ }
+}