{"id":1929,"date":"2024-06-19T12:28:08","date_gmt":"2024-06-19T12:28:08","guid":{"rendered":"https:\/\/www.w3computing.com\/articles\/?p=1929"},"modified":"2024-06-19T12:28:16","modified_gmt":"2024-06-19T12:28:16","slug":"how-to-use-javas-executorservice-for-concurrent-programming","status":"publish","type":"post","link":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-executorservice-for-concurrent-programming\/","title":{"rendered":"How to Use Java&#8217;s ExecutorService for Concurrent Programming"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Concurrent programming is essential for building high-performance applications that efficiently utilize multi-core processors. Java provides robust support for concurrency through the <code>java.util.concurrent<\/code> package, and one of its key components is the <code>ExecutorService<\/code>. This tutorial will guide you through the fundamentals of using <code>ExecutorService<\/code> for concurrent programming in Java. We&#8217;ll cover its various features, how to create and manage tasks, and how to handle task completion and error management. By the end of this tutorial, you will have a comprehensive understanding of how to leverage <code>ExecutorService<\/code> for your concurrent programming needs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Introduction to ExecutorService<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>ExecutorService<\/code> is part of the <code>java.util.concurrent<\/code> package and provides a higher-level replacement for working directly with threads. It offers a framework for managing a pool of threads, scheduling tasks to be executed by these threads, and handling task completion and errors.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Key Features of ExecutorService<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Thread Pool Management<\/strong>: Manages a pool of worker threads, optimizing the execution of multiple tasks.<\/li>\n\n\n\n<li><strong>Task Submission<\/strong>: Supports different ways to submit tasks, including <code>Runnable<\/code>, <code>Callable<\/code>, and <code>Future<\/code>.<\/li>\n\n\n\n<li><strong>Task Scheduling<\/strong>: Allows scheduling tasks to run after a delay or periodically.<\/li>\n\n\n\n<li><strong>Task Completion Handling<\/strong>: Provides mechanisms to retrieve the results of tasks and handle their completion.<\/li>\n\n\n\n<li><strong>Error Management<\/strong>: Includes features for handling exceptions and errors that occur during task execution.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2. Creating an ExecutorService<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You can create an <code>ExecutorService<\/code> using the <code>Executors<\/code> factory methods provided by the <code>java.util.concurrent<\/code> package. Here are some common ways to create an <code>ExecutorService<\/code>:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fixed Thread Pool<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A fixed thread pool creates a pool with a fixed number of threads.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">ExecutorService fixedThreadPool = Executors.newFixedThreadPool(<span class=\"hljs-number\">4<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Cached Thread Pool<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A cached thread pool creates new threads as needed and reuses previously constructed threads when available.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">ExecutorService cachedThreadPool = Executors.newCachedThreadPool();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Single Thread Executor<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A single-thread executor ensures that tasks are executed sequentially.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Scheduled Thread Pool<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A scheduled thread pool is used for scheduling tasks to run after a delay or periodically.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(<span class=\"hljs-number\">4<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">3. Submitting Tasks to ExecutorService<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tasks can be submitted to an <code>ExecutorService<\/code> in various forms, such as <code>Runnable<\/code>, <code>Callable<\/code>, and <code>Future<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Submitting Runnable Tasks<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A <code>Runnable<\/code> task does not return a result and cannot throw a checked exception.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Runnable task = () -&gt; {\n    System.out.println(<span class=\"hljs-string\">\"Executing task\"<\/span>);\n};\nExecutorService executorService = Executors.newFixedThreadPool(<span class=\"hljs-number\">2<\/span>);\nexecutorService.submit(task);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Submitting Callable Tasks<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A <code>Callable<\/code> task returns a result and can throw a checked exception.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Callable&lt;Integer&gt; task = () -&gt; {\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">123<\/span>;\n};\nFuture&lt;Integer&gt; future = executorService.submit(task);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Handling Futures<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can retrieve the result of a <code>Callable<\/code> task using the <code>Future<\/code> object.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">try<\/span> {\n    Integer result = future.get(); <span class=\"hljs-comment\">\/\/ This will block until the result is available<\/span>\n    System.out.println(<span class=\"hljs-string\">\"Result: \"<\/span> + result);\n} <span class=\"hljs-keyword\">catch<\/span> (InterruptedException | ExecutionException e) {\n    e.printStackTrace();\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Submitting Multiple Tasks<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can submit multiple tasks to the <code>ExecutorService<\/code> and wait for their completion using <code>invokeAll<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">List&lt;Callable&lt;Integer&gt;&gt; tasks = Arrays.asList(\n    () -&gt; <span class=\"hljs-number\">1<\/span>,\n    () -&gt; <span class=\"hljs-number\">2<\/span>,\n    () -&gt; <span class=\"hljs-number\">3<\/span>\n);\nList&lt;Future&lt;Integer&gt;&gt; futures = executorService.invokeAll(tasks);\n<span class=\"hljs-keyword\">for<\/span> (Future&lt;Integer&gt; future : futures) {\n    System.out.println(<span class=\"hljs-string\">\"Result: \"<\/span> + future.get());\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">4. Managing Task Completion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Managing task completion involves handling results and dealing with task timeouts.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Handling Timeouts<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can specify a timeout when retrieving the result from a <code>Future<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">try<\/span> {\n    Integer result = future.get(<span class=\"hljs-number\">1<\/span>, TimeUnit.SECONDS); <span class=\"hljs-comment\">\/\/ Wait for 1 second<\/span>\n    System.out.println(<span class=\"hljs-string\">\"Result: \"<\/span> + result);\n} <span class=\"hljs-keyword\">catch<\/span> (TimeoutException e) {\n    System.out.println(<span class=\"hljs-string\">\"Task timed out\"<\/span>);\n} <span class=\"hljs-keyword\">catch<\/span> (InterruptedException | ExecutionException e) {\n    e.printStackTrace();\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Waiting for Task Completion<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can wait for all tasks to complete using the <code>awaitTermination<\/code> method.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">executorService.shutdown();\n<span class=\"hljs-keyword\">try<\/span> {\n    <span class=\"hljs-keyword\">if<\/span> (!executorService.awaitTermination(<span class=\"hljs-number\">60<\/span>, TimeUnit.SECONDS)) {\n        executorService.shutdownNow();\n    }\n} <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\n    executorService.shutdownNow();\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">5. Handling Errors in ExecutorService<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Error handling is crucial in concurrent programming to ensure that exceptions in one task do not affect others.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Handling Exceptions in Runnable Tasks<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Since <code>Runnable<\/code> tasks cannot throw checked exceptions, you need to handle exceptions within the task.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Runnable task = () -&gt; {\n    <span class=\"hljs-keyword\">try<\/span> {\n        <span class=\"hljs-comment\">\/\/ Task logic<\/span>\n    } <span class=\"hljs-keyword\">catch<\/span> (Exception e) {\n        System.out.println(<span class=\"hljs-string\">\"Exception in task: \"<\/span> + e.getMessage());\n    }\n};\nexecutorService.submit(task);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Handling Exceptions in Callable Tasks<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Callable<\/code> tasks can throw checked exceptions, which are propagated to the <code>Future<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Callable&lt;Integer&gt; task = () -&gt; {\n    <span class=\"hljs-keyword\">if<\/span> (<span class=\"hljs-keyword\">true<\/span>) {\n        <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> Exception(<span class=\"hljs-string\">\"Exception in task\"<\/span>);\n    }\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">123<\/span>;\n};\nFuture&lt;Integer&gt; future = executorService.submit(task);\n<span class=\"hljs-keyword\">try<\/span> {\n    Integer result = future.get();\n} <span class=\"hljs-keyword\">catch<\/span> (ExecutionException e) {\n    System.out.println(<span class=\"hljs-string\">\"Exception in task: \"<\/span> + e.getCause().getMessage());\n} <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\n    e.printStackTrace();\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">6. Advanced Usage of ExecutorService<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Scheduled Tasks<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can schedule tasks to run after a delay or periodically using <code>ScheduledExecutorService<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(<span class=\"hljs-number\">2<\/span>);\n\n<span class=\"hljs-comment\">\/\/ Schedule a task to run after a 1-second delay<\/span>\nscheduledExecutorService.schedule(() -&gt; {\n    System.out.println(<span class=\"hljs-string\">\"Task executed after delay\"<\/span>);\n}, <span class=\"hljs-number\">1<\/span>, TimeUnit.SECONDS);\n\n<span class=\"hljs-comment\">\/\/ Schedule a task to run periodically every 2 seconds<\/span>\nscheduledExecutorService.scheduleAtFixedRate(() -&gt; {\n    System.out.println(<span class=\"hljs-string\">\"Periodic task executed\"<\/span>);\n}, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">2<\/span>, TimeUnit.SECONDS);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Custom Thread Factory<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can create a custom thread factory to control the creation of threads.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">ThreadFactory customThreadFactory = <span class=\"hljs-keyword\">new<\/span> ThreadFactory() {\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> AtomicInteger threadNumber = <span class=\"hljs-keyword\">new<\/span> AtomicInteger(<span class=\"hljs-number\">1<\/span>);\n\n    <span class=\"hljs-meta\">@Override<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> Thread <span class=\"hljs-title\">newThread<\/span><span class=\"hljs-params\">(Runnable r)<\/span> <\/span>{\n        Thread thread = <span class=\"hljs-keyword\">new<\/span> Thread(r, <span class=\"hljs-string\">\"CustomThread-\"<\/span> + threadNumber.getAndIncrement());\n        thread.setDaemon(<span class=\"hljs-keyword\">true<\/span>);\n        <span class=\"hljs-keyword\">return<\/span> thread;\n    }\n};\n\nExecutorService customExecutorService = Executors.newFixedThreadPool(<span class=\"hljs-number\">2<\/span>, customThreadFactory);\ncustomExecutorService.submit(() -&gt; {\n    System.out.println(Thread.currentThread().getName() + <span class=\"hljs-string\">\" executing task\"<\/span>);\n});<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">ExecutorCompletionService<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ExecutorCompletionService<\/code> combines an <code>Executor<\/code> with a <code>BlockingQueue<\/code> to retrieve the results of completed tasks.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">ExecutorCompletionService&lt;Integer&gt; completionService = <span class=\"hljs-keyword\">new<\/span> ExecutorCompletionService&lt;&gt;(executorService);\nList&lt;Callable&lt;Integer&gt;&gt; tasks = Arrays.asList(\n    () -&gt; <span class=\"hljs-number\">1<\/span>,\n    () -&gt; <span class=\"hljs-number\">2<\/span>,\n    () -&gt; <span class=\"hljs-number\">3<\/span>\n);\n<span class=\"hljs-keyword\">for<\/span> (Callable&lt;Integer&gt; task : tasks) {\n    completionService.submit(task);\n}\n\n<span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; tasks.size(); i++) {\n    <span class=\"hljs-keyword\">try<\/span> {\n        Future&lt;Integer&gt; future = completionService.take(); <span class=\"hljs-comment\">\/\/ Retrieves and removes the next completed task<\/span>\n        System.out.println(<span class=\"hljs-string\">\"Result: \"<\/span> + future.get());\n    } <span class=\"hljs-keyword\">catch<\/span> (InterruptedException | ExecutionException e) {\n        e.printStackTrace();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">7. Best Practices for Using ExecutorService<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Proper Shutdown<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Always shut down the <code>ExecutorService<\/code> to release resources.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">executorService.shutdown();\n<span class=\"hljs-keyword\">try<\/span> {\n    <span class=\"hljs-keyword\">if<\/span> (!executorService.awaitTermination(<span class=\"hljs-number\">60<\/span>, TimeUnit.SECONDS)) {\n        executorService.shutdownNow();\n    }\n} <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\n    executorService.shutdownNow();\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Handling Uncaught Exceptions<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use an <code>UncaughtExceptionHandler<\/code> to handle uncaught exceptions in threads.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">ThreadFactory threadFactory = <span class=\"hljs-keyword\">new<\/span> ThreadFactory() {\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> AtomicInteger threadNumber = <span class=\"hljs-keyword\">new<\/span> AtomicInteger(<span class=\"hljs-number\">1<\/span>);\n\n    <span class=\"hljs-meta\">@Override<\/span>\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> Thread <span class=\"hljs-title\">newThread<\/span><span class=\"hljs-params\">(Runnable r)<\/span> <\/span>{\n        Thread thread = <span class=\"hljs-keyword\">new<\/span> Thread(r, <span class=\"hljs-string\">\"Thread-\"<\/span> + threadNumber.getAndIncrement());\n        thread.setUncaughtExceptionHandler((t, e) -&gt; {\n            System.out.println(<span class=\"hljs-string\">\"Uncaught exception in thread \"<\/span> + t.getName() + <span class=\"hljs-string\">\": \"<\/span> + e.getMessage());\n        });\n        <span class=\"hljs-keyword\">return<\/span> thread;\n    }\n};\n\nExecutorService executorServiceWithHandler = Executors.newFixedThreadPool(<span class=\"hljs-number\">2<\/span>, threadFactory);\nexecutorServiceWithHandler.submit(() -&gt; {\n    <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> RuntimeException(<span class=\"hljs-string\">\"Exception in task\"<\/span>);\n});<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Tuning Thread Pool Size<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Properly tune the thread pool size based on the nature of tasks (CPU-bound or I\/O-bound).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CPU-bound tasks<\/strong>: Number of threads should be equal to the number of available processors.<\/li>\n\n\n\n<li><strong>I\/O-bound tasks<\/strong>: Number of threads should be higher than the number of available processors, typically 2 times or more.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">int numberOfProcessors = Runtime.getRuntime().availableProcessors();\nExecutorService cpuBoundExecutor = Executors.newFixedThreadPool(numberOfProcessors);\nExecutorService ioBoundExecutor = Executors.newFixedThreadPool(numberOfProcessors * 2);<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Using Future with Timeouts<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use timeouts with <code>Future.get()<\/code> to prevent indefinite blocking.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">try<\/span> {\n    Integer result = future.get(<span class=\"hljs-number\">1<\/span>, TimeUnit.SECONDS);\n    System.out.println(<span class=\"hljs-string\">\"Result: \"<\/span> + result);\n} <span class=\"hljs-keyword\">catch<\/span> (TimeoutException e) {\n    System.out.println(<span class=\"hljs-string\">\"Task timed out\"<\/span>);\n} <span class=\"hljs-keyword\">catch<\/span> (InterruptedException | ExecutionException e) {\n    e.printStackTrace();\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Graceful Degradation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Implement graceful degradation for tasks that can tolerate failure.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Callable&lt;Integer&gt; resilientTask = () -&gt; {\n    <span class=\"hljs-keyword\">try<\/span> {\n        <span class=\"hljs-comment\">\/\/ Simulate task logic<\/span>\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">123<\/span>;\n    } <span class=\"hljs-keyword\">catch<\/span> (Exception e) {\n        <span class=\"hljs-comment\">\/\/ Log and return a default value<\/span>\n        System.out.println(<span class=\"hljs-string\">\"Exception in task: \"<\/span> + e.getMessage());\n        <span class=\"hljs-keyword\">return<\/span> -<span class=\"hljs-number\">1<\/span>;\n    }\n};\nFuture&lt;Integer&gt; future = executorService.submit(resilientTask);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">8. Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Using <code>ExecutorService<\/code> in Java simplifies the management of concurrent tasks by abstracting the complexities of thread management. It provides a flexible and robust framework for submitting, managing, and monitoring tasks. By following the best practices outlined in this tutorial, you can effectively leverage <code>ExecutorService<\/code> to build high-performance, scalable applications.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Concurrent programming is essential for building high-performance applications that efficiently utilize multi-core processors. Java provides robust support for concurrency through the java.util.concurrent package, and one of its key components is the ExecutorService. This tutorial will guide you through the fundamentals of using ExecutorService for concurrent programming in Java. We&#8217;ll cover its various features, how to [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5,4],"tags":[],"class_list":["post-1929","post","type-post","status-publish","format-standard","category-java","category-programming-languages","entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to Use Java&#039;s ExecutorService for Concurrent Programming<\/title>\n<meta name=\"description\" content=\"Java provides robust support for concurrency through the java.util.concurrent package, and one of its key components is the ExecutorService.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-executorservice-for-concurrent-programming\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Use Java&#039;s ExecutorService for Concurrent Programming\" \/>\n<meta property=\"og:description\" content=\"Java provides robust support for concurrency through the java.util.concurrent package, and one of its key components is the ExecutorService.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-executorservice-for-concurrent-programming\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-19T12:28:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-19T12:28:16+00:00\" \/>\n<meta name=\"author\" content=\"w3compadmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"w3compadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-use-javas-executorservice-for-concurrent-programming\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-use-javas-executorservice-for-concurrent-programming\\\/\"},\"author\":{\"name\":\"w3compadmin\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"headline\":\"How to Use Java&#8217;s ExecutorService for Concurrent Programming\",\"datePublished\":\"2024-06-19T12:28:08+00:00\",\"dateModified\":\"2024-06-19T12:28:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-use-javas-executorservice-for-concurrent-programming\\\/\"},\"wordCount\":665,\"articleSection\":[\"Java\",\"Programming Languages\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-use-javas-executorservice-for-concurrent-programming\\\/\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-use-javas-executorservice-for-concurrent-programming\\\/\",\"name\":\"How to Use Java's ExecutorService for Concurrent Programming\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\"},\"datePublished\":\"2024-06-19T12:28:08+00:00\",\"dateModified\":\"2024-06-19T12:28:16+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"description\":\"Java provides robust support for concurrency through the java.util.concurrent package, and one of its key components is the ExecutorService.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-use-javas-executorservice-for-concurrent-programming\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-use-javas-executorservice-for-concurrent-programming\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-use-javas-executorservice-for-concurrent-programming\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Articles Home\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Programming Languages\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/programming-languages\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/programming-languages\\\/java\\\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"How to Use Java&#8217;s ExecutorService for Concurrent Programming\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\",\"name\":\"Developer Articles Hub\",\"description\":\"\",\"alternateName\":\"Developer Articles\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\",\"name\":\"w3compadmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"contentUrl\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"caption\":\"w3compadmin\"},\"sameAs\":[\"http:\\\/\\\/w3computing.com\\\/articles\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Use Java's ExecutorService for Concurrent Programming","description":"Java provides robust support for concurrency through the java.util.concurrent package, and one of its key components is the ExecutorService.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-executorservice-for-concurrent-programming\/","og_locale":"en_US","og_type":"article","og_title":"How to Use Java's ExecutorService for Concurrent Programming","og_description":"Java provides robust support for concurrency through the java.util.concurrent package, and one of its key components is the ExecutorService.","og_url":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-executorservice-for-concurrent-programming\/","article_published_time":"2024-06-19T12:28:08+00:00","article_modified_time":"2024-06-19T12:28:16+00:00","author":"w3compadmin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"w3compadmin","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-executorservice-for-concurrent-programming\/#article","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-executorservice-for-concurrent-programming\/"},"author":{"name":"w3compadmin","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"headline":"How to Use Java&#8217;s ExecutorService for Concurrent Programming","datePublished":"2024-06-19T12:28:08+00:00","dateModified":"2024-06-19T12:28:16+00:00","mainEntityOfPage":{"@id":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-executorservice-for-concurrent-programming\/"},"wordCount":665,"articleSection":["Java","Programming Languages"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-executorservice-for-concurrent-programming\/","url":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-executorservice-for-concurrent-programming\/","name":"How to Use Java's ExecutorService for Concurrent Programming","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/#website"},"datePublished":"2024-06-19T12:28:08+00:00","dateModified":"2024-06-19T12:28:16+00:00","author":{"@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"description":"Java provides robust support for concurrency through the java.util.concurrent package, and one of its key components is the ExecutorService.","breadcrumb":{"@id":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-executorservice-for-concurrent-programming\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.w3computing.com\/articles\/how-to-use-javas-executorservice-for-concurrent-programming\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-executorservice-for-concurrent-programming\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Articles Home","item":"https:\/\/www.w3computing.com\/articles\/"},{"@type":"ListItem","position":2,"name":"Programming Languages","item":"https:\/\/www.w3computing.com\/articles\/programming-languages\/"},{"@type":"ListItem","position":3,"name":"Java","item":"https:\/\/www.w3computing.com\/articles\/programming-languages\/java\/"},{"@type":"ListItem","position":4,"name":"How to Use Java&#8217;s ExecutorService for Concurrent Programming"}]},{"@type":"WebSite","@id":"https:\/\/www.w3computing.com\/articles\/#website","url":"https:\/\/www.w3computing.com\/articles\/","name":"Developer Articles Hub","description":"","alternateName":"Developer Articles","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.w3computing.com\/articles\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561","name":"w3compadmin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","url":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","contentUrl":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","caption":"w3compadmin"},"sameAs":["http:\/\/w3computing.com\/articles"]}]}},"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"w3compadmin","author_link":"https:\/\/www.w3computing.com\/articles\/author\/w3compadmin\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1929","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/comments?post=1929"}],"version-history":[{"count":1,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1929\/revisions"}],"predecessor-version":[{"id":1930,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1929\/revisions\/1930"}],"wp:attachment":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/media?parent=1929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/categories?post=1929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/tags?post=1929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}