BAEL-4033 LinkedBlockingQueue vs ConcurrentLinkedQueue (#9281)
* BAEL-4033 Added unit test cases for LinkedBlockingQueue and ConcurrentLinkedQueue * BAEL-4033 Updated unit test class names due to PMD rule violations * Moved files to another module based on the editor review
This commit is contained in:
parent
c395a43472
commit
73762873f6
@ -23,7 +23,12 @@
|
|||||||
<artifactId>jmh-generator-annprocess</artifactId>
|
<artifactId>jmh-generator-annprocess</artifactId>
|
||||||
<version>${jmh.version}</version>
|
<version>${jmh.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.assertj</groupId>
|
||||||
|
<artifactId>assertj-core</artifactId>
|
||||||
|
<version>${assertj.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<build>
|
<build>
|
||||||
<sourceDirectory>src</sourceDirectory>
|
<sourceDirectory>src</sourceDirectory>
|
||||||
@ -42,6 +47,8 @@
|
|||||||
<properties>
|
<properties>
|
||||||
<jmh.version>1.21</jmh.version>
|
<jmh.version>1.21</jmh.version>
|
||||||
<guava.version>28.2-jre</guava.version>
|
<guava.version>28.2-jre</guava.version>
|
||||||
|
<!-- testing -->
|
||||||
|
<assertj.version>3.6.1</assertj.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
@ -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<Integer> elements = Arrays.asList(1, 2, 3, 4, 5);
|
||||||
|
ConcurrentLinkedQueue<Integer> 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<Integer> 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<Integer> concurrentLinkedQueue = new ConcurrentLinkedQueue<>();
|
||||||
|
Runnable offerTask = () -> concurrentLinkedQueue.offer(element);
|
||||||
|
|
||||||
|
Callable<Integer> pollTask = () -> {
|
||||||
|
while (concurrentLinkedQueue.peek() != null) {
|
||||||
|
return concurrentLinkedQueue.poll()
|
||||||
|
.intValue();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
executorService.submit(offerTask);
|
||||||
|
TimeUnit.SECONDS.sleep(1);
|
||||||
|
|
||||||
|
Future<Integer> returnedElement = executorService.submit(pollTask);
|
||||||
|
assertThat(returnedElement.get()
|
||||||
|
.intValue(), is(equalTo(element)));
|
||||||
|
executorService.awaitTermination(1, TimeUnit.SECONDS);
|
||||||
|
executorService.shutdown();
|
||||||
|
}
|
||||||
|
}
|
@ -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<Integer> elements = Arrays.asList(1, 2, 3, 4, 5);
|
||||||
|
LinkedBlockingQueue<Integer> 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<Integer> 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<Integer> linkedBlockingQueue = new LinkedBlockingQueue<>();
|
||||||
|
Runnable putTask = () -> {
|
||||||
|
try {
|
||||||
|
linkedBlockingQueue.put(element);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Callable<Integer> takeTask = () -> {
|
||||||
|
try {
|
||||||
|
return linkedBlockingQueue.take();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
executorService.submit(putTask);
|
||||||
|
Future<Integer> 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();
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user