swirl
Home Software Blog Wallpapers Webtools
Multi-threaded producer - consumer in Java
Thursday 02, July 2020   |   Post link

The producer - consumer pattern is quite famous. It's where a bunch of work items are 'produced' at a high rate which cannot be processed at the same rate usually because applying business-logic usually requires things like database lookups, CPU intensive calculations & other logic.

Producer-consumer-diagram

The usual way to deal with this is to use multiple threads. Now using multiple threads usually comes with its own idiosyncrasies like protecting shared data and others. When working in Java, using a blocking queue makes implementing this pattern really simple.

The idea is to have a piece of code let's call it the 'producer' which knows what work-items need to be processed store the work-items in a queue. A bunch of threads keep polling the queue for any work-item which is made available on the queue.

Blocking queue

Using a blocking queue like the LinkedBlockingQueue allows you to do this easily as this class is thread safe i.e. the producer code can safely place items on the queue using the 'put' method. The consumer code can safely read items off the queue using the 'take' or 'poll' method. The 'take' method is a blocking method i.e. the thread will wait forever until an item is found on the queue. The 'poll' method allows you to specify a timeout so that if the queue doesn't contain any items, the method will return a null.

The implementation allows the main program to stop the producer and consumers by calling the 'signalStop' method. Since both the producer and the consumer would like this abiity to stop, this functionality is made available in the 'Stopable' class which is the base class of Producer and Consumer. The source code is given below:




Comments

Posts By Year

2020 (6)
2019 (6)
2018 (8)
2017 (11)
2016 (6)
2015 (18)
2014 (2)
2013 (4)
2012 (2)

Posts By Category

.NET (1)
.NET Core (2)
ASP.NET MVC (4)
AWS API Gateway (1)
Android (1)
Architecture (1)
Azure (2)
Book review (3)
Business (1)
C# (3)
C++ (1)
Containers (3)
Corporate culture (1)
Database (3)
Database migration (1)
Desktop (1)
DotNet (2)
Entity Framework (3)
Git (2)
IIS (1)
JDBC (1)
Java (5)
Life (6)
Linux (1)
Lucene (1)
Multi-threading (1)
OData (1)
Office (1)
PHP (1)
PowerShell (2)
Programming (21)
Rants (5)
SQL (2)
SQL Server (1)
Software Engineering (1)
Software development (1)
Solr (1)
Sql Server (2)
Storage (1)
T-SQL (1)
TDD (1)
TSQL (5)
Tablet (1)
Technology (1)
Test Driven (1)
Unit Testing (1)
Utilities (2)
VC++ (1)
VMWare (1)
VSCode (1)
Visual Studio (2)
Wallpapers (1)
Windows (9)
XML (2)

Posts By Tags

.NET(3) API Gateway(1) ASP.NET(4) AWS(1) Adults(1) Advertising(1) Android(1) Anti-forgery(1) Azure(2) Backup(1) Beliefs(1) BlockingQueue(1) Book review(2) Books(1) Busy(1) C#(3) C++(3) CLR(1) CORS(1) CSRF(1) CTE(1) Callbacks(1) Checkbox(1) Cmdlet(1) Commons(1) Company culture(1) Complexity(1) Consumer(1) Consumerism(1) Containers(3) Core(2) DPI(1) Data-time(1) Database(4) Debugging(1) Delegates(1) Developer(2) Dockers(2) EF 1.0(1) Entity framework(1) Events(1) File copy(1) File history(1) Font(1) Git(2) GradleApache(1) HierarchyID(1) IIS(1) Installing(1) Intelli J(1) JDBC(1) JSON(1) JUnit(1) Java(1) JavaScript(1) Linux(1) Localization(1) Log4J(1) Lucene(1) MVC(4) Management(2) Migration history(1) Mobile Apps(1) Modern Life(1) Money(1) OData(1) OPENXML(1) Objects(1) Office(1) Organization(1) PHP(1) Paths(1) PowerShell(2) Producer(1) Programming(1) Python(1) Quality(1) REDIS(2) Runtimes(1) SD card(1) SQL(2) SQL Code-first Migration(1) SSH(1) Sattelite assemblies(1) School(1) Self reliance(1) Shell(1) Solr(1) Sony VAIO(1) Spirituality(1) Sql Express(1) System Image(1) TDD(1) TSQL(3) Table variables(1) Tables(1) Tablet(1) Url rewrite(1) VMWare(1) Validation(2) Wallpaper(1) Wallpapers(1) Web Development(4) Windows(2) Windows 10(2) Windows 2016(2) Windows 8.1(1) Work culture(1) XML(1) Yii(1)