Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java multithreading in CPU load

I have a bit of an issue with an application running multiple Java threads. The application runs a number of working threads that peek continuously at an input queue and if there are messages in the queue they pull them out and process them.

Among those working threads there is another verification thread scheduled to perform at a fixed period a check to see if the host (on which the application runs) is still in "good shape" to run the application. This thread updates an AtomicBoolean value which in turn is verified by the working thread before they start peeking to see if the host is OK.

My problem is that in cases with high CPU load the thread responsible with the verification will take longer because it has to compete with all the other threads. If the AtomicBoolean does not get updated after a certain period it is automatically set to false, causing me a nasty bottleneck.

My initial approach was to increase the priority of the verification thread, but digging into it deeper I found that this is not a guaranteed behavior and an algorithm shouldn't rely on thread priority to function correctly.

Anyone got any alternative ideas? Thanks!

like image 225
Smith Cosmin Avatar asked Feb 26 '13 14:02

Smith Cosmin


People also ask

Does multithreading increase CPU usage?

Multithreading allows many parts of a program to run simultaneously. These parts are referred to as threads, and they are lightweight processes that are available within the process. As a result, multithreading increases CPU utilization through multitasking.

Does multithreading reduce idle time of CPU?

So if you have a program with multiple threads, and if those threads are scheduled on multiple cores, the CPU time will increase, but wall time may decrease. If you have a multi-threaded program that relies on CPU and doesn't to I/O, then the CPU time will be close to wall time * number of cores. Save this answer.

Do Java threads run on different cores?

Modern computer systems are designed with multiple CPU cores. These cores allow multiple processes (or multiple threads of a process) to run concurrently on different cores.

How many threads can be executed at a CPU?

A single CPU core can have up-to 2 threads per core. For example, if a CPU is dual core (i.e., 2 cores) it will have 4 threads.


1 Answers

Instead of peeking into a regular queue data structure, use the java.util.concurrent package's LinkedBlockingQueue.

What you can do is, run an pool of threads (you could use executer service's fixed thread pool, i.e., a number of workers of your choice) and do LinkedBlockingQueue.take().

If a message arrives at the queue, it is fed to one of the waiting threads (yeah, take does block the thread until there is something to be fed with).

Java API Reference for Linked Blocking Queue's take method

HTH.

like image 191
maggu Avatar answered Oct 05 '22 12:10

maggu