{"id":97960,"date":"2020-12-15T11:00:09","date_gmt":"2020-12-15T09:00:09","guid":{"rendered":"https:\/\/examples.javacodegeeks.com\/?p=97960"},"modified":"2020-12-15T16:08:49","modified_gmt":"2020-12-15T14:08:49","slug":"java-futuretask-example","status":"publish","type":"post","link":"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/","title":{"rendered":"Java FutureTask Example"},"content":{"rendered":"<h2 class=\"wp-block-heading\" id=\"h-1-introduction\">1. Introduction<\/h2>\n<p>Java provides the <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/concurrent\/package-summary.html\" target=\"_blank\">java.util.concurrent<\/a> package since 1.5 to support parallel execution. It improves the performance when dealing with a time consuming task. The <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/concurrent\/FutureTask.html\" target=\"_blank\">java.util.concurrent.FutureTask<\/a> class provides a base implementation of the <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/concurrent\/Future.html\" target=\"_blank\">java.util.concurrent.Future<\/a> interface. The following class diagram outlines <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/concurrent\/FutureTask.html\" target=\"_blank\">FutureTask<\/a> and its relationship with <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/concurrent\/Callable.html\" target=\"_blank\" rel=\"noreferrer noopener\">Callable<\/a>, <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/Runnable.html\" target=\"_blank\" rel=\"noreferrer noopener\">Runnable<\/a>, <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/concurrent\/Future.html\" target=\"_blank\" rel=\"noreferrer noopener\">Future<\/a>, <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/concurrent\/Executors.html\" target=\"_blank\" rel=\"noreferrer noopener\">Executor<\/a>, and <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/concurrent\/ExecutorService.html\" target=\"_blank\" rel=\"noreferrer noopener\">ExecutorService<\/a>.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"533\" height=\"570\" src=\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2020\/12\/FutureTask.jpg\" alt=\"Java FutureTask class diagram\" class=\"wp-image-98137\" srcset=\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2020\/12\/FutureTask.jpg 533w, https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2020\/12\/FutureTask-281x300.jpg 281w\" sizes=\"(max-width: 533px) 100vw, 533px\" \/><figcaption>Figure 1 FutureTask Class Diagram<\/figcaption><\/figure>\n<\/div>\n<p>In this example, I will demonstrate the following:<\/p>\n<ul class=\"wp-block-list\">\n<li>How to create a <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/concurrent\/FutureTask.html\" target=\"_blank\" rel=\"noreferrer noopener\">FutureTask<\/a> object from a <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/concurrent\/Callable.html\" target=\"_blank\" rel=\"noreferrer noopener\">Callable<\/a> Task<\/li>\n<li>How to create a <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/concurrent\/FutureTask.html\" target=\"_blank\" rel=\"noreferrer noopener\">FutureTask<\/a> object from a <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/lang\/Runnable.html\" target=\"_blank\" rel=\"noreferrer noopener\">Runable<\/a> Task<\/li>\n<li>How to run tasks parallel<\/li>\n<li>How to cancel a <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/concurrent\/FutureTask.html\" target=\"_blank\" rel=\"noreferrer noopener\">FutureTask<\/a><\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\" id=\"h-2-technologies-used\">2. Technologies Used<\/h2>\n<p>The example code in this article was built and run using:<\/p>\n<ul class=\"wp-block-list\">\n<li>Java 11<\/li>\n<li>Maven 3.3.9<\/li>\n<li>Eclipse Oxygen<\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\" id=\"h-3-maven-project\">3. Maven Project<\/h2>\n<h3 class=\"wp-block-heading\" id=\"h-3-1-dependencies\">3.1 Dependencies<\/h3>\n<p>No any dependencies needed.<\/p>\n<p><span style=\"text-decoration: underline\"><em>pom.xml<\/em><\/span>\n<\/p>\n<pre class=\"wp-block-preformatted brush:xml\">&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\n\txmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n\txsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\n\t&lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n\t&lt;groupId&gt;com.jcg.example&lt;\/groupId&gt;\n\t&lt;artifactId&gt;FutureTask-example-code&lt;\/artifactId&gt;\n\t&lt;packaging&gt;jar&lt;\/packaging&gt;\n\t&lt;version&gt;1.0&lt;\/version&gt;\n\t&lt;name&gt;FutureTask Example Code&lt;\/name&gt;\n\t&lt;build&gt;\n\t\t&lt;sourceDirectory&gt;src&lt;\/sourceDirectory&gt;\n\t\t&lt;plugins&gt;\n\t\t\t&lt;plugin&gt;\n\t\t\t\t&lt;artifactId&gt;maven-compiler-plugin&lt;\/artifactId&gt;\n\t\t\t\t&lt;version&gt;3.8.0&lt;\/version&gt;\n\t\t\t\t&lt;configuration&gt;\n\t\t\t\t\t&lt;release&gt;11&lt;\/release&gt;\n\t\t\t\t&lt;\/configuration&gt;\n\t\t\t&lt;\/plugin&gt;\n\t\t&lt;\/plugins&gt;\n\t&lt;\/build&gt;\n&lt;\/project&gt;\n<\/pre>\n<h3 class=\"wp-block-heading\" id=\"h-3-2-count-service\">3.2 Count Service<\/h3>\n<p>In this step, I will create a <code>CountService<\/code> which has one method &#8211; <code>countNumberOfDivisble(long firstNumber, long lastNumber, long divisor)<\/code> method. It returns the number of multiples of <code>divisor<\/code> between <code>firstNumber<\/code> and <code>lastNumber<\/code>.<\/p>\n<p><span style=\"text-decoration: underline\"><em>CountService.java<\/em><\/span> <\/p>\n<pre class=\"wp-block-preformatted brush:java\">package org.jcg.zheng;\n\npublic class CountService {\n\t\/**\n\t * Count number of divisible.\n\t * \n\t * Returns the count of numbers that can be divided by the divisor without\n\t * remainder.\n\t *\n\t * @param firstNumber the start number\n\t * @param lastNumber  the finish number\n\t * @param divisor     the divisor\n\t * @return the count of these numbers which can be divisible by the divisor from\n\t *         firstNumber to the lastNumber\n\t *\/\n\tpublic long countNumberOfDivisible(long firstNumber, long lastNumber, long divisor) {\n\t\tlong count = 0;\n\n\t\tfor (long i = firstNumber; i &lt;= lastNumber; i++) {\n\t\t\tif (i % divisor == 0) {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\n\t\treturn count;\n\t}\n}\n<\/pre>\n<h3 class=\"wp-block-heading\" id=\"h-3-3-count-task-data\">3.3 Count Task Data<\/h3>\n<p>In this step, I will create a <code>CountTaskData<\/code> which defines the following data members:<\/p>\n<ul class=\"wp-block-list\">\n<li><code>beginNumber<\/code> &#8211; for beginning number.<\/li>\n<li><code>endNumber<\/code> &#8211; for ending number.<\/li>\n<li><code>DIVISOR<\/code> &#8211; constant with value of 3.<\/li>\n<li><code>MAX_NUMBER<\/code> &#8211; constant with value of 30,000,000,001.<\/li>\n<li><code>createTwoTasks()<\/code> &#8211; create two <code>CountTaskData<\/code> objects. The first starts from 0 to the middle of the max number. The second starts from the middle and ends at the max number. I will use it later to count the multiples of 3 from 0 to 30,000,000,001 concurrently.<\/li>\n<\/ul>\n<p><span style=\"text-decoration: underline\"><em>CountTaskData.java<\/em><\/span> <\/p>\n<pre class=\"wp-block-preformatted brush:java\">package org.jcg.zheng;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class CountTaskData {\n\n\t\/\/ DIVISOR to be used in calculation\n\tpublic static final long DIVISOR = 3;\n\n\t\/\/ Maximum number to check\n\tpublic static final long MAX_NUMBER = 3000000000l;\n\n\tpublic static List&lt;CountTaskData&gt; createTwoTasks() {\n\t\tList&lt;CountTaskData&gt; tasks = new ArrayList&lt;&gt;();\n\n\t\ttasks.add(new CountTaskData(0, MAX_NUMBER \/ 2));\n\t\ttasks.add(new CountTaskData(MAX_NUMBER \/ 2 + 1, MAX_NUMBER));\n\n\t\treturn tasks;\n\t}\n\n\tprivate long beginNumber;\n\tprivate long endNumber;\n\n\tpublic CountTaskData(long beginNumber, long endNumber) {\n\t\tsuper();\n\t\tthis.beginNumber = beginNumber;\n\t\tthis.endNumber = endNumber;\n\t}\n\n\tpublic long getBeginNumber() {\n\t\treturn beginNumber;\n\t}\n\n\tpublic long getEndNumber() {\n\t\treturn endNumber;\n\t}\n}\n<\/pre>\n<h3 class=\"wp-block-heading\" id=\"h-3-4-callable-count-task\">3.4 Callable Count Task<\/h3>\n<p>In this step, I will create a <code>CallableCountTask<\/code> class which implements <code>Callable<\/code> and returns a <code>Long<\/code> value.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<ul class=\"wp-block-list\">\n<li><code>CallableCountTask<\/code> &#8211; constructor to create an object.<\/li>\n<li><code>call()<\/code> &#8211; invokes <code>countService.countNumerOfDivisible<\/code>() and returns the counts.<\/li>\n<\/ul>\n<p><span style=\"text-decoration: underline\"><em>CallableCountTask.java<\/em><\/span> <\/p>\n<pre class=\"wp-block-preformatted brush:java\">package org.jcg.zheng.concurrent;\n\nimport java.util.concurrent.Callable;\n\nimport org.jcg.zheng.CountService;\n\npublic class CallableCountTask implements Callable&lt;Long&gt; {\n\n\tprivate CountService cutService = new CountService();\n\tprivate long divisor;\n\tprivate long first;\n\tprivate long last;\n\n\tpublic CallableCountTask(long first, long last, long divisor) {\n\t\tthis.first = first;\n\t\tthis.last = last;\n\t\tthis.divisor = divisor;\n\t}\n\n\t@Override\n\tpublic Long call() throws Exception {\n\t\tSystem.out.println(Thread.currentThread().getName() + \" call starts.\");\n\t\tlong ret = countService.countNumberOfDivisible(first, last, divisor);\n\t\tSystem.out.println(Thread.currentThread().getName() + \" call ends.\");\n\t\treturn ret;\n\t}\n\n}\n<\/pre>\n<h3 class=\"wp-block-heading\" id=\"h-3-5-runnabletask\">3.5 RunnableTask<\/h3>\n<p>In this step, I will create a <code>RunnableTask<\/code> class which implements <code>Runnable<\/code> and doesn&#8217;t return anything.<\/p>\n<ul class=\"wp-block-list\">\n<li><code>run()<\/code> &#8211; sleeps for a given period, catches <code>java.lang.InterruptedException<\/code> and prints out a message.<\/li>\n<\/ul>\n<p><span style=\"text-decoration: underline\"><em>RunnableTask.java<\/em><\/span> <\/p>\n<pre class=\"wp-block-preformatted brush:java\">package org.jcg.zheng.concurrent;\n\npublic class RunnableTask implements Runnable {\n\n\t\/\/ use this to illustrate a long running task\n\tprivate long sleepMills;\n\n\tpublic RunnableTask(long sleepMills) {\n\t\tsuper();\n\t\tthis.sleepMills = sleepMills;\n\t}\n\n\t@Override\n\tpublic void run() {\n\t\ttry {\n\t\t\tSystem.out.println(Thread.currentThread().getName() + \" run starts.\");\n\t\t\tThread.sleep(sleepMills);\n                        System.out.println(Thread.currentThread().getName() + \" run ends.\");\n\t\t} catch (InterruptedException e) {\n\t\t\tSystem.out.println(Thread.currentThread().getName() + \" interrupted.\");\n\t\t}\n\n\t}\n\n}\n<\/pre>\n<h2 class=\"wp-block-heading\" id=\"h-4-demo\">4. Demo<\/h2>\n<h3 class=\"wp-block-heading\" id=\"h-4-1-sequential-execution-demo\">4.1 Sequential Execution Demo<\/h3>\n<p>In this step, I will create a <code>SequentialExecutionDemo<\/code> class which finds the number of multiples of 3 between 0 and 30,000,000,001.<\/p>\n<p><span style=\"text-decoration: underline\"><em>SequentialExecutionDemo.java<\/em><\/span> <\/p>\n<pre class=\"wp-block-preformatted brush:java\">package org.jcg.zheng.concurrent;\n\nimport java.time.Duration;\nimport java.time.Instant;\n\nimport org.jcg.zheng.CountService;\nimport org.jcg.zheng.CountTaskData;\n\npublic class SequentialExecutionDemo {\n\tpublic static void main(String[] args) {\n\t\t\/\/ Completed in 46805 ms.\n\t\tInstant begin = Instant.now();\n\t\tlong counts = (new CountService()).countNumberOfDivisible(0, CountTaskData.MAX_NUMBER, CountTaskData.DIVISOR);\n\n\t\tInstant end = Instant.now();\n\t\tSystem.out.println(\"Result: \" + counts + \" time=\" + Duration.between(begin, end).toMillis() + \" ms.\");\n\t}\n\n}\n<\/pre>\n<p>Execute it as a Java application and capture the output here.<\/p>\n<pre class=\"wp-block-preformatted brush:plain\">C:\\MaryZheng\\Workspaces\\jcg-FutureTask-example\\target\\classes&gt;java org.jcg.zheng.concurrent.SequentialExecutionDemo\nResult: 1000000001 time=47471 ms.<\/pre>\n<p>As you seen here, it took about 47 seconds to complete.<\/p>\n<h3 class=\"wp-block-heading\" id=\"h-4-2-parallel-execution-demo\">4.2 Parallel Execution Demo<\/h3>\n<p>In this step, I will create a <code>ParallelExecutionDemo<\/code> class which finds the number of multiples of 3 between 0 and 30,000,000,001 with two parallel tasks. Here are the main steps:<\/p>\n<ol class=\"wp-block-list\">\n<li>Create a two-thread pool with <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/concurrent\/Executors.html\" target=\"_blank\" rel=\"noreferrer noopener\">java.util.concurrent.Executors<\/a>.<\/li>\n<li>Create two <code>FutureTask<\/code> objects with <code>CallableCountTask<\/code>.<\/li>\n<li>Submit or execute the <code>FutureTask<\/code>.<\/li>\n<li>Get the <code>FutureTask<\/code> result.<\/li>\n<li>Combine two <code>FutureTask<\/code>&#8216;s results.<\/li>\n<\/ol>\n<p>In this step, I will demonstrate with three different methods:<\/p>\n<ul class=\"wp-block-list\">\n<li><code>executeViaFutureTask<\/code>() &#8211; creates two <code>FutureTask<\/code>s with <code>CallableCountTask<\/code>.  Invoking <code>ExecutorService<\/code>&#8216;s <code>execute<\/code>() method.<\/li>\n<li><code>submitViaFutureTask<\/code>() &#8212; creates two <code>FutureTasks<\/code> with <code>CallableCountTask<\/code>. Invoking ExecutorService&#8217;s <code>submit()<\/code> method.<\/li>\n<li><code>submitViaCallableTask<\/code>() &#8211; Using ExecutorService&#8217;s&#8217;s submit() method and uses <code>Future<\/code> to get the result. This is to show the difference between <code>Future<\/code> and <code>FutureTask<\/code>.<\/li>\n<\/ul>\n<p><span style=\"text-decoration: underline\"><em>ParallelExecutionDemo.java<\/em><\/span> <\/p>\n<pre class=\"wp-block-preformatted brush:java\">package org.jcg.zheng.concurrent;\n\nimport java.time.Duration;\nimport java.time.Instant;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.Future;\nimport java.util.concurrent.FutureTask;\n\nimport org.jcg.zheng.CountTaskData;\n\npublic class ParallelExecutionDemo {\n\n\tpublic static void main(String[] args) {\n\t\tInstant begin = Instant.now();\n\t\tSystem.out.println(\"Starting parallel execution ....\");\n\n\t\t\/\/ Create a new ExecutorService with 2 thread to execute and store the Futures\n\t\tExecutorService executor = Executors.newFixedThreadPool(2);\n\t\tList&lt;FutureTask&lt;Long&gt;&gt; tasks = new ArrayList&lt;&gt;();\n\t\t\n\t\tlong resultFuture = 0;\n\t\tswitch (args[0]) {\n\t\tcase \"executeViaFutureTask\":\n\t\t\tresultFuture = executeViaFutureTask(executor, tasks);\n\t\t\tbreak;\n\t\tcase \"submitViaFutureTask\":\n\t\t\tresultFuture = submitViaFutureTask(executor, tasks);\n\t\t\tbreak;\n\t\tcase \"submitViaCallableTask\":\n\t\t\tresultFuture = submitViaCallableTask(executor);\n\t\t\tbreak;\n\t\t}\n\n\t\t\/\/ Shutdown the ExecutorService\n\t\texecutor.shutdown();\n\t\tInstant end = Instant.now();\n\n\t\tSystem.out.println(\n\t\t\t\t\"Result (Future): \" + resultFuture + \" time= \" + Duration.between(begin, end).toMillis() + \" ms\");\n\n\t}\n\n\t\/**\n\t * Result (Future): 1000000001 time= 45612 ms Result (Future): 1000000001 time=\n\t * 35592 ms\n\t *\/\n\tprivate static long executeViaFutureTask(ExecutorService executor, List&lt;FutureTask&lt;Long&gt;&gt; tasks) {\n\t\tfor (CountTaskData td : CountTaskData.createTwoTasks()) {\n\t\t\tFutureTask&lt;Long&gt; futureTask = new FutureTask&lt;&gt;(\n\t\t\t\t\tnew CallableCountTask(td.getBeginNumber(), td.getEndNumber(), CountTaskData.DIVISOR));\n\t\t\ttasks.add(futureTask);\n\t\t\texecutor.execute(futureTask);\n\t\t}\n\n\t\treturn getConcurrentResult(tasks);\n\t}\n\n\t\/**\n\t * Result (Future): 1000000001 time= 33320 ms\n\t *\/\n\tprivate static long submitViaFutureTask(ExecutorService executor, List&lt;FutureTask&lt;Long&gt;&gt; tasks) {\n\t\tfor (CountTaskData td : CountTaskData.createTwoTasks()) {\n\t\t\tFutureTask&lt;Long&gt; futureTask = new FutureTask&lt;&gt;(\n\t\t\t\t\tnew CallableCountTask(td.getBeginNumber(), td.getEndNumber(), CountTaskData.DIVISOR));\n\t\t\ttasks.add(futureTask);\n\t\t\texecutor.submit(futureTask);\n\t\t}\n\n\t\treturn getConcurrentResult(tasks);\n\t}\n\n\tprivate static long getConcurrentResult(List&lt;FutureTask&lt;Long&gt;&gt; tasks) {\n\t\tlong resultFuture = 0;\n\t\t\n\t\t\/\/ Wait until all results are available and combine them at the same time\n\t\tfor (FutureTask&lt;Long&gt; futureTask : tasks) {\n\t\t\ttry {\n\t\t\t\tresultFuture += futureTask.get();\n\t\t\t} catch (InterruptedException | ExecutionException e) {\n\t\t\t\te.printStackTrace();\n\t\t\t}\n\t\t}\n\t\treturn resultFuture;\n\t}\n\n\t\/**\n\t * Result (Future): 1000000001 time= 32490 ms\n\t *\/\n\tprivate static long submitViaCallableTask(ExecutorService executor) {\n\t\tlong resultFuture = 0;\n\t\tList&lt;Future&lt;Long&gt;&gt; taskList = new ArrayList&lt;&gt;();\n\n\t\tfor (CountTaskData td : CountTaskData.createTwoTasks()) {\n\t\t\tFuture&lt;Long&gt; ret = executor\n\t\t\t\t\t.submit(new CallableCountTask(td.getBeginNumber(), td.getEndNumber(), CountTaskData.DIVISOR));\n\t\t\ttaskList.add(ret);\n\t\t}\n\n\t\t\/\/ Wait until all results are available and combine them at the same time\n\t\tfor (Future&lt;Long&gt; futureTask : taskList) {\n\t\t\ttry {\n\t\t\t\tresultFuture += futureTask.get();\n\t\t\t} catch (InterruptedException | ExecutionException e) {\n\t\t\t\te.printStackTrace();\n\t\t\t}\n\t\t}\n\t\treturn resultFuture;\n\t}\n\n}\n<\/pre>\n<p>Execute it as Java application and enter different arguments and capture the output here.<\/p>\n<pre class=\"wp-block-preformatted brush:java\">C:\\MaryZheng\\Workspaces\\jcg-FutureTask-example\\target\\classes&gt;java org.jcg.zheng.concurrent.ParallelExecutionDemo executeViaFutureTask\nStarting parallel execution ....\npool-1-thread-2 call.\npool-1-thread-1 call.\nResult (Future): 0 time= 29313 ms\n\nC:\\MaryZheng\\Workspaces\\jcg-FutureTask-example\\target\\classes&gt;java org.jcg.zheng.concurrent.ParallelExecutionDemo submitViaFutureTask\nStarting parallel execution ....\npool-1-thread-2 call.\npool-1-thread-1 call.\nResult (Future): 0 time= 29918 ms\n\nC:\\MaryZheng\\Workspaces\\jcg-FutureTask-example\\target\\classes&gt;java org.jcg.zheng.concurrent.ParallelExecutionDemo submitViaCallableTask\nStarting parallel execution ....\npool-1-thread-1 call.\npool-1-thread-2 call.\nResult (Future): 0 time= 29425 ms<\/pre>\n<p>As you seen here, the total execution time is reduced comparing to the sequential execution.<\/p>\n<h3 class=\"wp-block-heading\" id=\"h-4-3-cancel-execution-demo\">4.3 Cancel Execution Demo<\/h3>\n<p>In this step, I will create a CancelExecutionDemo class that cancels the asynchronous job before it completes. Here are the main steps:<\/p>\n<ol class=\"wp-block-list\" id=\"block-937ac12d-a978-4857-b0d1-7f0b329fd168\">\n<li>Create a two-thread pool with <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/util\/concurrent\/Executors.html\" target=\"_blank\" rel=\"noreferrer noopener\">java.util.concurrent.Executors<\/a>.<\/li>\n<li>Create two <code>FutureTask<\/code> objects, one from <code>CallableCountTask<\/code>, the other from <code>RunnableTask<\/code>.<\/li>\n<li>Submit or execute the <code>FutureTask<\/code>.<\/li>\n<li>Cancel the <code>FutureTask<\/code>.<\/li>\n<\/ol>\n<p>Cancelling a FutureTask may ends up with three results:<\/p>\n<ul class=\"wp-block-list\">\n<li>The <code>FutureTask<\/code> is cancelled successfully.<\/li>\n<li>The <code>FutureTask<\/code> already started and then interrupted.<\/li>\n<li>The <code>FutureTask<\/code> already started and continued to the end. <\/li>\n<\/ul>\n<p><span style=\"text-decoration: underline\"><em>CancelExecutionDemo.java<\/em><\/span> <\/p>\n<pre class=\"wp-block-preformatted brush:java\">package org.jcg.zheng.concurrent;\n\nimport java.time.Duration;\nimport java.time.Instant;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.FutureTask;\nimport java.util.concurrent.TimeUnit;\n\nimport org.jcg.zheng.CountTaskData;\n\npublic class CancelExecutionDemo {\n\n\tpublic static void main(String[] args) {\n\t\tInstant begin = Instant.now();\n\n\t\tExecutorService executor = Executors.newFixedThreadPool(2);\n\t\t\n\t\tFutureTask&lt;Long&gt; runnableTask = new FutureTask&lt;&gt;(new RunnableTask(100), Long.valueOf(10));\n\t\tFutureTask&lt;Long&gt; callableTask = new FutureTask&lt;&gt;(\n\t\t\t\tnew CallableCountTask(0, CountTaskData.MAX_NUMBER, CountTaskData.DIVISOR));\n\n\t\tswitch (args[0]) {\n\t\tcase \"cancelSubmitFutureTask\":\n\t\t\tcancelSubmitFutureTask(executor, runnableTask, callableTask);\n\t\t\tbreak;\n\t\tcase \"cancelExecuteFutureTask\":\n\t\t\tcancelExecuteFutureTask(executor, runnableTask, callableTask);\n\t\t\tbreak;\n\t\tcase \"cancelRunningFutureTask\":\n\t\t\tcancelRunningFutureTask(executor, runnableTask, callableTask);\n\t\t\tbreak;\n\t\t}\n\n\t\t\/\/ Shutdown the ExecutorService\n\t\texecutor.shutdown();\n\n\t\tInstant end = Instant.now();\n\n\t\ttry {\n\t\t\texecutor.awaitTermination(5, TimeUnit.MINUTES);\n\t\t} catch (InterruptedException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t\t\n\t\tSystem.out.println(\n\t\t\t\tThread.currentThread().getName() + \" Completed in \" + Duration.between(begin, end).toMillis() + \" ms.\");\n\n\t}\n\n\tprivate static void cancelSubmitFutureTask(ExecutorService executor, FutureTask&lt;Long&gt; runnableTask,\n\t\t\tFutureTask&lt;Long&gt; callableTask) {\n\t\texecutor.submit(runnableTask);\n\n\t\t\/\/ Cancel the job\n\t\tif (!runnableTask.isDone()) {\n\t\t\tboolean cancelStatus = runnableTask.cancel(true);\n\t\t\tSystem.out.println(\" runnableTask cancel status \" + cancelStatus);\n\t\t}\n\n\t\texecutor.submit(callableTask);\n\n\t\t\/\/ Cancel the job\n\t\tif (!callableTask.isDone()) {\n\t\t\tboolean cancelStatus = callableTask.cancel(true);\n\t\t\tSystem.out.println(\" callableTask cancel status \" + cancelStatus);\n\t\t}\n\n\t}\n\n\tprivate static void cancelExecuteFutureTask(ExecutorService executor, FutureTask&lt;Long&gt; runnableTask,\n\t\t\tFutureTask&lt;Long&gt; callableTask) {\n\n\t\texecutor.execute(runnableTask);\n\n\t\t\/\/ Cancel the job\n\t\tif (!runnableTask.isDone()) {\n\t\t\tboolean cancelStatus = runnableTask.cancel(true);\n\t\t\tSystem.out.println(\" runnableTask cancel status \" + cancelStatus);\n\t\t}\n\n\t\texecutor.submit(callableTask);\n\n\t\t\/\/ Cancel the job\n\t\tif (!callableTask.isDone()) {\n\t\t\tboolean cancelStatus = callableTask.cancel(true);\n\t\t\tSystem.out.println(\" callableTask cancel status \" + cancelStatus);\n\t\t}\n\n\t}\n\n\t \n\n\tprivate static void cancelRunningFutureTask(ExecutorService executor, FutureTask&lt;Long&gt; runnableTask,\n\t\t\tFutureTask&lt;Long&gt; callableTask) {\n\t\texecutor.submit(runnableTask);\n\t\texecutor.submit(callableTask);\n\n\t\ttry {\n\t\t\tThread.sleep(80);\n\t\t} catch (InterruptedException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\n\t\t\/\/ Cancel the job\n\t\tif (!runnableTask.isDone()) {\n\t\t\tboolean cancelStatus = runnableTask.cancel(true);\n\t\t\tSystem.out.println(\" runnableTask cancel status \" + cancelStatus);\n\t\t}\n\n\t\t\/\/ Cancel the job\n\t\tif (!callableTask.isDone()) {\n\t\t\tboolean cancelStatus = callableTask.cancel(true);\n\t\t\tSystem.out.println(\" callableTask cancel status \" + cancelStatus);\n\t\t}\n\n\t}\n\n}\n<\/pre>\n<p>Execute it and capture output here.<\/p>\n<p><span style=\"text-decoration: underline\"><em>Cancel Output<\/em><\/span>\n<\/p>\n<pre class=\"wp-block-preformatted brush:plain highlight:[14,17]\">C:\\MaryZheng\\Workspaces\\jcg-FutureTask-example\\target\\classes&gt;java org.jcg.zheng.concurrent.CancelExecutionDemo cancelSubmitFutureTask\n runnableTask cancel status true\n callableTask cancel status true\nmain Completed in 83 ms.\n\nC:\\MaryZheng\\Workspaces\\jcg-FutureTask-example\\target\\classes&gt;java org.jcg.zheng.concurrent.CancelExecutionDemo cancelExecuteFutureTask\n runnableTask cancel status true\n callableTask cancel status true\nmain Completed in 78 ms.\n\nC:\\MaryZheng\\Workspaces\\jcg-FutureTask-example\\target\\classes&gt;java org.jcg.zheng.concurrent.CancelExecutionDemo cancelRunningFutureTask\npool-1-thread-1 run starts.\npool-1-thread-2 call starts.\npool-1-thread-1 interrupted.\n runnableTask cancel status true\n callableTask cancel status true\npool-1-thread-2 call ends.\nmain Completed in 137 ms.\n\nC:\\MaryZheng\\Workspaces\\jcg-FutureTask-example\\target\\classes&gt;<\/pre>\n<ul class=\"wp-block-list\">\n<li>line 14: <code>FutureTask<\/code> with <code>Runnable<\/code> is interrupted. <\/li>\n<li>line 17: <code>FutureTask<\/code> with <code>Callable<\/code> is completed.<\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\" id=\"h-5-summary\">5. Summary<\/h2>\n<p>In this example, I demonstrated how to create a <code>FutureTask<\/code> object from both <code>Callable<\/code> and <code>Runnable<\/code>. I also showed how to execute tasks concurrently to improve performance. Finally, I demonstrated how to cancel a submitted <code>FutureTask<\/code> and its three possible outcomes.<\/p>\n<h2 class=\"wp-block-heading\" id=\"h-6-references\">6. References<\/h2>\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/examples.javacodegeeks.com\/core-java\/util\/concurrent\/futuretask\/java-util-concurrent-futuretask-example\/\">java.util.concurrent.FutureTask Example<\/a><\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\" id=\"h-7-download-the-source-code\">7. Download the Source Code<\/h2>\n<div class=\"download\"><strong>Download<\/strong><br \/>\nYou can download the full source code of this example here: <a href=\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2020\/12\/jcg-futuretask-example.zip\"><strong>Java FutureTask Example<\/strong><\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>1. Introduction Java provides the java.util.concurrent package since 1.5 to support parallel execution. It improves the performance when dealing with a time consuming task. The java.util.concurrent.FutureTask class provides a base implementation of the java.util.concurrent.Future interface. The following class diagram outlines FutureTask and its relationship with Callable, Runnable, Future, Executor, and ExecutorService. Figure 1 FutureTask Class &hellip;<\/p>\n","protected":false},"author":140,"featured_media":1204,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-97960","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-core-java"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Java FutureTask Example - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"1. Introduction Java provides the java.util.concurrent package since 1.5 to support parallel execution. It improves the performance when dealing with a\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java FutureTask Example - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"1. Introduction Java provides the java.util.concurrent package since 1.5 to support parallel execution. It improves the performance when dealing with a\" \/>\n<meta property=\"og:url\" content=\"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/\" \/>\n<meta property=\"og:site_name\" content=\"Examples Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2020-12-15T09:00:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-12-15T14:08:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/java-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Mary Zheng\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mary Zheng\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/\"},\"author\":{\"name\":\"Mary Zheng\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/8a2034fbabcb20a9396e9819261855ae\"},\"headline\":\"Java FutureTask Example\",\"datePublished\":\"2020-12-15T09:00:09+00:00\",\"dateModified\":\"2020-12-15T14:08:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/\"},\"wordCount\":622,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/java-logo.jpg\",\"articleSection\":[\"Core Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/\",\"url\":\"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/\",\"name\":\"Java FutureTask Example - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/java-logo.jpg\",\"datePublished\":\"2020-12-15T09:00:09+00:00\",\"dateModified\":\"2020-12-15T14:08:49+00:00\",\"description\":\"1. Introduction Java provides the java.util.concurrent package since 1.5 to support parallel execution. It improves the performance when dealing with a\",\"breadcrumb\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/#primaryimage\",\"url\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/java-logo.jpg\",\"contentUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/java-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"Bipartite Graph\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/examples.javacodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java Development\",\"item\":\"https:\/\/examples.javacodegeeks.com\/category\/java-development\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Core Java\",\"item\":\"https:\/\/examples.javacodegeeks.com\/category\/java-development\/core-java\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Java FutureTask Example\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#website\",\"url\":\"https:\/\/examples.javacodegeeks.com\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Examples and Code Snippets\",\"publisher\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/examples.javacodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/examples.javacodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/javacodegeeks\",\"https:\/\/x.com\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/8a2034fbabcb20a9396e9819261855ae\",\"name\":\"Mary Zheng\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2017\/11\/Mary-Zheng_avatar_1510732235-96x96.jpg\",\"contentUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2017\/11\/Mary-Zheng_avatar_1510732235-96x96.jpg\",\"caption\":\"Mary Zheng\"},\"description\":\"Mary has graduated from Mechanical Engineering department at ShangHai JiaoTong University. She also holds a Master degree in Computer Science from Webster University. During her studies she has been involved with a large number of projects ranging from programming and software engineering. She works as a senior Software Engineer in the telecommunications sector where she acts as a leader and works with others to design, implement, and monitor the software solution.\",\"url\":\"https:\/\/examples.javacodegeeks.com\/author\/mary-zheng\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Java FutureTask Example - Java Code Geeks","description":"1. Introduction Java provides the java.util.concurrent package since 1.5 to support parallel execution. It improves the performance when dealing with a","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:\/\/examples.javacodegeeks.com\/java-futuretask-example\/","og_locale":"en_US","og_type":"article","og_title":"Java FutureTask Example - Java Code Geeks","og_description":"1. Introduction Java provides the java.util.concurrent package since 1.5 to support parallel execution. It improves the performance when dealing with a","og_url":"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/","og_site_name":"Examples Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2020-12-15T09:00:09+00:00","article_modified_time":"2020-12-15T14:08:49+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/java-logo.jpg","type":"image\/jpeg"}],"author":"Mary Zheng","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Mary Zheng","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/#article","isPartOf":{"@id":"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/"},"author":{"name":"Mary Zheng","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/8a2034fbabcb20a9396e9819261855ae"},"headline":"Java FutureTask Example","datePublished":"2020-12-15T09:00:09+00:00","dateModified":"2020-12-15T14:08:49+00:00","mainEntityOfPage":{"@id":"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/"},"wordCount":622,"commentCount":0,"publisher":{"@id":"https:\/\/examples.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/#primaryimage"},"thumbnailUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/java-logo.jpg","articleSection":["Core Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/","url":"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/","name":"Java FutureTask Example - Java Code Geeks","isPartOf":{"@id":"https:\/\/examples.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/#primaryimage"},"image":{"@id":"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/#primaryimage"},"thumbnailUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/java-logo.jpg","datePublished":"2020-12-15T09:00:09+00:00","dateModified":"2020-12-15T14:08:49+00:00","description":"1. Introduction Java provides the java.util.concurrent package since 1.5 to support parallel execution. It improves the performance when dealing with a","breadcrumb":{"@id":"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/#primaryimage","url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/java-logo.jpg","contentUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/java-logo.jpg","width":150,"height":150,"caption":"Bipartite Graph"},{"@type":"BreadcrumbList","@id":"https:\/\/examples.javacodegeeks.com\/java-futuretask-example\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/examples.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java Development","item":"https:\/\/examples.javacodegeeks.com\/category\/java-development\/"},{"@type":"ListItem","position":3,"name":"Core Java","item":"https:\/\/examples.javacodegeeks.com\/category\/java-development\/core-java\/"},{"@type":"ListItem","position":4,"name":"Java FutureTask Example"}]},{"@type":"WebSite","@id":"https:\/\/examples.javacodegeeks.com\/#website","url":"https:\/\/examples.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Examples and Code Snippets","publisher":{"@id":"https:\/\/examples.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/examples.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/examples.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/examples.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/8a2034fbabcb20a9396e9819261855ae","name":"Mary Zheng","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2017\/11\/Mary-Zheng_avatar_1510732235-96x96.jpg","contentUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2017\/11\/Mary-Zheng_avatar_1510732235-96x96.jpg","caption":"Mary Zheng"},"description":"Mary has graduated from Mechanical Engineering department at ShangHai JiaoTong University. She also holds a Master degree in Computer Science from Webster University. During her studies she has been involved with a large number of projects ranging from programming and software engineering. She works as a senior Software Engineer in the telecommunications sector where she acts as a leader and works with others to design, implement, and monitor the software solution.","url":"https:\/\/examples.javacodegeeks.com\/author\/mary-zheng\/"}]}},"_links":{"self":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/97960","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/users\/140"}],"replies":[{"embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=97960"}],"version-history":[{"count":0,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/97960\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/media\/1204"}],"wp:attachment":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=97960"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=97960"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=97960"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}