Please enable JavaScript.
Coggle requires JavaScript to display documents.
6.1 Executing Tasks in Threads - Coggle Diagram
6.1 Executing Tasks in Threads
Identifying Task Boundaries
Define sensible task boundaries
Prefer independent tasks
No shared state, results, or side effects
Independence = concurrency
Tasks should be small units of processing capacity
Server Application Goals
Good throughput
Good responsiveness
Support many users (low cost per user)
Graceful degradation under heavy load
Choosing Task Boundaries
Common boundary: individual client requests
Used in:
Web servers
Mail servers
File servers
EJB containers
Database servers
Benefits:
Independence
Right task size
Task Execution Policies
Sequential Execution (Single Thread)
Simple policy
Used in:
GUI frameworks
Downsides:
Blocking delays entire server
Poor resource utilization
Poor responsiveness and throughput
Suitable only for:
Few, long-lived tasks
Single-client servers
Thread-Per-Task Execution
New thread for each request
Benefits:
Main thread stays responsive
Parallel task processing
Improved throughput and responsiveness
Requirement:
Code must be thread-safe
Disadvantages of Unbounded Thread Creation
Thread Lifecycle Overhead
Thread creation & destruction is expensive
Adds latency in request processing
Resource Consumption
Threads consume memory & CPU
Idle threads = wasted memory
Excess threads = GC pressure + CPU contention
Stability Risks
Thread limits exist (JVM/OS)
Hitting limit = OutOfMemoryError
Hard to recover → better to avoid unbounded creation
Conclusion & Best Practices
Place a bound on thread creation
Test under load to ensure:
Graceful degradation
Avoid crashes
Don’t rely on "it worked during dev"—test production-like scenarios