{"id":444,"date":"2023-06-09T12:08:03","date_gmt":"2023-06-09T12:08:03","guid":{"rendered":"https:\/\/quadbase.com\/blog\/?p=444"},"modified":"2023-06-21T20:10:34","modified_gmt":"2023-06-21T20:10:34","slug":"java-multi-threading-in-espresschart-api","status":"publish","type":"post","link":"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/","title":{"rendered":"Java multi-threading in EspressChart API"},"content":{"rendered":"\n<p>If you are using the ERES in a multi-user environment, multiple users can be exporting reports and charts at the same time, utilizing multiple CPU cores.<\/p>\n\n\n\n<p>However, if you are using the EC, ER, EDAB or ERES API to export charts locally, the application typically runs in a single thread.<\/p>\n\n\n\n<p>In the following code block, there&#8217;s an example of a single-threaded chart export using the EspressChart API.<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-java&quot;,&quot;theme&quot;:&quot;base16-light&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;Java&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;java&quot;}\">\/\/ do not connect to the EspressManager server\nQbChart.setEspressManagerUsed(false);\n\n\/\/ our chart template is parameterized\n\/\/ it uses a single integer as the argument\nObject queryParams[] = new Object[1];\n\n\/\/ set the argument to &quot;1&quot;\nqueryParams[0] = 1;\n\n\/\/ create an instance of the QbChart object\nQbChart chart = new QbChart((Applet)null, &quot;chartTemplate.pac&quot;, queryParams);\n\n\/\/ export the chart to a PNG file\nchart.export(QbChart.PNG, &quot;exportedChart.png&quot;);\n<\/pre><\/div>\n\n\n\n<p>If you run the previous code in a loop (even with different parameter values), it can export as many charts as you want, however, it will export one chart at a time using a single CPU thread. Most of the CPU will be idle.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"861\" height=\"657\" src=\"https:\/\/quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image2-1.png\" alt=\"\" class=\"wp-image-445\" srcset=\"https:\/\/www.quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image2-1.png 861w, https:\/\/www.quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image2-1-300x229.png 300w, https:\/\/www.quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image2-1-768x586.png 768w\" sizes=\"auto, (max-width: 861px) 100vw, 861px\" \/><figcaption class=\"wp-element-caption\">CPU utilization in a single-threaded application<\/figcaption><\/figure>\n\n\n\n<p>This will negatively impact the overall performance of your API implementation on a modern CPU with many threads. On the other hand, if you are exporting a single chart or just a few charts at the same time, the export should be finished within a couple of seconds maximum.<\/p>\n\n\n\n<p>However, it is possible to utilize multiple CPU cores even via the EspressChart API without connecting to the EC, ER, EDAB or ERES server by utilizing Java multi threading. In this example, we are using EspressChart API but similar code can be used for speeding up EspressReport export too. To use this code with EspressReport, replace the QbChart Java class with QbReport. The rest of the code is the same for both EspressChart and Espress Report.<\/p>\n\n\n\n<p>In this example, we want to export 10,000 charts. All charts will be using the same chart template (although it would be also possible for every chart to be different, with some code changes) but different data.<\/p>\n\n\n\n<p>The chart template is parameterized. The chart takes one parameter &#8211; a customer ID (integer). The chart is loading its data from a MySQL 8 database.<\/p>\n\n\n\n<p>This is how the chart template looks in Chart Designer.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"832\" src=\"https:\/\/quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image4-1-1024x832.png\" alt=\"\" class=\"wp-image-446\" srcset=\"https:\/\/www.quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image4-1-1024x832.png 1024w, https:\/\/www.quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image4-1-300x244.png 300w, https:\/\/www.quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image4-1-768x624.png 768w, https:\/\/www.quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image4-1.png 1028w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>We want to export 10,000 of these charts, each with a different customer ID in as little time as possible.<\/p>\n\n\n\n<p>We\u2019ll create a multi-threaded Java application using the EspressChart API.<\/p>\n\n\n\n<p>We\u2019ll create two Java classes:<\/p>\n\n\n\n<p>BenchmarkRunner.java<\/p>\n\n\n\n<p>The BenchmarkRunner.java class will be the executable class and it will control the multi-threaded application.<\/p>\n\n\n\n<p>ChartExporter.java<\/p>\n\n\n\n<p>The ChartExporter.java class will be doing the actual exporting.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"233\" height=\"267\" src=\"https:\/\/quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image1-1.png\" alt=\"\" class=\"wp-image-447\"\/><figcaption class=\"wp-element-caption\">project file structure<\/figcaption><\/figure>\n<\/div>\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-java&quot;,&quot;theme&quot;:&quot;base16-light&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;Java&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;java&quot;}\">private List&lt;Integer&gt; paramList, paramListSynchronized;\n \n\/**\n * launches the multi-threaded benchmark\n *\n * @param args default argument, no arguments needed for this app\n *\/\npublic static void main(String[] args) {\nnew BenchmarkRunner();\n}\n \npublic BenchmarkRunner() {\n\/\/ set the number of application threads that will be used for export\n            \/\/ set as many threads as your CPU can handle\n            \/\/ using more threads than your CPU has is counter-productive\n            \/\/ for instance for AMD 5950X, we'll use 32 threads\n            int threadCount = 32;\n \n            \/\/ fetch the parameter list\n            \/\/ a reference of this list will be passed to all threads\n            paramList = new ArrayList&lt;&gt;();\n            for (int k = 1; k &lt;= 50; k++) {\n            \tparamList.add(k);\n            }\n \n            paramListSynchronized = Collections.synchronizedList(paramList);\n \n            \/\/ we're starting the export, save the current system time in milliseconds\n            long starttime = System.currentTimeMillis();\n \n            \/\/ create a new Fixed Thread Pool in the size of the threadCount\n            ExecutorService executor = Executors.newFixedThreadPool(threadCount);\n            List&lt;Future&lt;?&gt;&gt; futures = new ArrayList&lt;&gt;();\n \n            \/\/ start all threads one by one\n            for (int i = 1; i &lt;= threadCount; i++) {\n            \t\/\/ create a new thread\n                        \/\/ initialize the ChartBenchmarkTemplate class using it's only constructor\n                        \/\/ pass the paramList as a reference\n                        Future&lt;?&gt; f = executor\n                                                        \t.submit(new ChartExporter(i, &quot;templates\/StatementChart.pac&quot;, paramListSynchronized));\n \n                         \/\/ add to the futures list so we have a list of all threads we launched\n                         futures.add(f);\n}\n \n            \/\/ iterate over the threads\n            for (Future&lt;?&gt; f : futures) {\n            \ttry {\n                        \t\/\/ wait for the thread to finish\n                                   f.get();\n} catch (InterruptedException e) {\n                        \t\/\/ basic error handling, use something better in your project\n                                   e.printStackTrace();\n} catch (ExecutionException e) {\n                        \t\/\/ basic error handling, use something better in your project\n                                   \te.printStackTrace();\n}\n}\n \n\/\/ all threads have finished, print out the time difference (in milliseconds)\n            \/\/ and exit the application\n            System.out.println(&quot;--- All threads completed in &quot; + (System.currentTimeMillis() - starttime) + &quot; miliseconds&quot;);\n            \/\/ we're done, exit the application\n            System.exit(0);\n}\n\n  \n \/**\n  * initialize the chart export thread\n  *\n  * @param threadid \tthe number of the thread. Informative. Only used in a\n  *                 \tprintln\n  * @param templateName the name of the chart template that will be exported\n  * @param params   \tthe list of all remaining parameters waiting to be\n  *                     exported\n  *\/\n public ChartExporter(int threadid, String templateName, List&lt;Integer&gt; params) {\n \/\/ do not use EspressManager for the export\n QbChart.setEspressManagerUsed(false);\n \tthis.threadid = threadid;\n            this.template = templateName;\n            this.params = params;\n}\n \n\/**\n * Get a parameter out of the params list and export it\n *\/\npublic void export() {\n\/\/ prepare a variable that will store the parameter\n            Object queryParams[] = new Object[1];\n \n \t\/\/ while the params list still contains parameters to be exported, take one\n            \/\/ parameter and export it\n            while (params.size() &gt; 0) {\n            \t\/\/ it's important to handle the params list in a synchronized block to prevent\n            \/\/ concurrent modification\n            \/\/ synchronize by the params list only, all other commands can run in parallel\n            synchronized (params) {\n            \/\/ take and remove the last parameter from the params list and save it in this\n            \/\/ thread\n            \tqueryParams[0] = params.remove(params.size() - 1);\n \t}\n \n \t\/\/ just prints an informative message\n            System.out.println(&quot;Thread nr. &quot; + threadid + &quot; exporting chart ID &quot; + queryParams[0]);\n \n \t\/\/ load the chart from the template, apply the parameter\n            QbChart chart = new QbChart((Applet) null, template, queryParams);\n \n            \/\/ export the chart\n            chart.export(QbChart.PNG, &quot;dist\/StatementChartID_&quot; + queryParams[0] + &quot;.png&quot;);\n} \n}<\/pre><\/div>\n\n\n\n<p>This application can use all of our CPU threads to speed-up the exporting.<\/p>\n\n\n\n<p>Please note that this application makes sense only if you want to export many charts as quickly as possible. Export of a single chart will still be single-threaded.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"858\" height=\"656\" src=\"https:\/\/quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image3-1.png\" alt=\"\" class=\"wp-image-450\" srcset=\"https:\/\/www.quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image3-1.png 858w, https:\/\/www.quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image3-1-300x229.png 300w, https:\/\/www.quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image3-1-768x587.png 768w\" sizes=\"auto, (max-width: 858px) 100vw, 858px\" \/><figcaption class=\"wp-element-caption\">all CPU threads are being utilized for chart exporting<\/figcaption><\/figure>\n\n\n\n<p>You can download the full source code, including the chart template file here: <a href=\"https:\/\/www.quadbase.com\/downloads\/QuadbaseMultiThreadedExport.zip\">https:\/\/www.quadbase.com\/downloads\/QuadbaseMultiThreadedExport.zip<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you are using the ERES in a multi-user environment, multiple users can be exporting reports and charts at the same time, utilizing multiple CPU cores. However, if you are &#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"nf_dc_page":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-444","post","type-post","status-publish","format-standard","hentry","category-all"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Java multi-threading in EspressChart API - Quadbase Systems Inc.<\/title>\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.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java multi-threading in EspressChart API - Quadbase Systems Inc.\" \/>\n<meta property=\"og:description\" content=\"If you are using the ERES in a multi-user environment, multiple users can be exporting reports and charts at the same time, utilizing multiple CPU cores. However, if you are ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/\" \/>\n<meta property=\"og:site_name\" content=\"Quadbase Systems Inc.\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/QuadbaseSystemsInc\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-09T12:08:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-21T20:10:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image2-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"861\" \/>\n\t<meta property=\"og:image:height\" content=\"657\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"quadbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@Quadbase\" \/>\n<meta name=\"twitter:site\" content=\"@Quadbase\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"quadbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/\"},\"author\":{\"name\":\"quadbase\",\"@id\":\"https:\/\/www.quadbase.com\/blog\/#\/schema\/person\/547fc659bc4b72e45049ed279a4fadc8\"},\"headline\":\"Java multi-threading in EspressChart API\",\"datePublished\":\"2023-06-09T12:08:03+00:00\",\"dateModified\":\"2023-06-21T20:10:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/\"},\"wordCount\":457,\"publisher\":{\"@id\":\"https:\/\/www.quadbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image2-1.png\",\"articleSection\":[\"All\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/\",\"url\":\"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/\",\"name\":\"Java multi-threading in EspressChart API - Quadbase Systems Inc.\",\"isPartOf\":{\"@id\":\"https:\/\/www.quadbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image2-1.png\",\"datePublished\":\"2023-06-09T12:08:03+00:00\",\"dateModified\":\"2023-06-21T20:10:34+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/#primaryimage\",\"url\":\"https:\/\/quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image2-1.png\",\"contentUrl\":\"https:\/\/quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image2-1.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"HOME\",\"item\":\"https:\/\/www.quadbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java multi-threading in EspressChart API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.quadbase.com\/blog\/#website\",\"url\":\"https:\/\/www.quadbase.com\/blog\/\",\"name\":\"Quadbase Systems Inc.\",\"description\":\"Company blog about enterprise reporting, java charts, business intelligence.\",\"publisher\":{\"@id\":\"https:\/\/www.quadbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.quadbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.quadbase.com\/blog\/#organization\",\"name\":\"Quadbase Systems Inc.\",\"url\":\"https:\/\/www.quadbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.quadbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.quadbase.com\/blog\/wp-content\/uploads\/2023\/09\/Method-Draw-Image27.png\",\"contentUrl\":\"https:\/\/www.quadbase.com\/blog\/wp-content\/uploads\/2023\/09\/Method-Draw-Image27.png\",\"width\":199,\"height\":90,\"caption\":\"Quadbase Systems Inc.\"},\"image\":{\"@id\":\"https:\/\/www.quadbase.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/QuadbaseSystemsInc\/\",\"https:\/\/x.com\/Quadbase\",\"https:\/\/www.youtube.com\/user\/QuadbaseSystems\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.quadbase.com\/blog\/#\/schema\/person\/547fc659bc4b72e45049ed279a4fadc8\",\"name\":\"quadbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/14148ecbe810a872c3aa322d49f590829742ea41bc80e6bbd234b131fcfa0746?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/14148ecbe810a872c3aa322d49f590829742ea41bc80e6bbd234b131fcfa0746?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/14148ecbe810a872c3aa322d49f590829742ea41bc80e6bbd234b131fcfa0746?s=96&d=mm&r=g\",\"caption\":\"quadbase\"},\"url\":\"https:\/\/www.quadbase.com\/blog\/author\/quadbase\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Java multi-threading in EspressChart API - Quadbase Systems Inc.","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.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/","og_locale":"en_US","og_type":"article","og_title":"Java multi-threading in EspressChart API - Quadbase Systems Inc.","og_description":"If you are using the ERES in a multi-user environment, multiple users can be exporting reports and charts at the same time, utilizing multiple CPU cores. However, if you are ...","og_url":"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/","og_site_name":"Quadbase Systems Inc.","article_publisher":"https:\/\/www.facebook.com\/QuadbaseSystemsInc\/","article_published_time":"2023-06-09T12:08:03+00:00","article_modified_time":"2023-06-21T20:10:34+00:00","og_image":[{"width":861,"height":657,"url":"https:\/\/www.quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image2-1.png","type":"image\/png"}],"author":"quadbase","twitter_card":"summary_large_image","twitter_creator":"@Quadbase","twitter_site":"@Quadbase","twitter_misc":{"Written by":"quadbase","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/#article","isPartOf":{"@id":"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/"},"author":{"name":"quadbase","@id":"https:\/\/www.quadbase.com\/blog\/#\/schema\/person\/547fc659bc4b72e45049ed279a4fadc8"},"headline":"Java multi-threading in EspressChart API","datePublished":"2023-06-09T12:08:03+00:00","dateModified":"2023-06-21T20:10:34+00:00","mainEntityOfPage":{"@id":"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/"},"wordCount":457,"publisher":{"@id":"https:\/\/www.quadbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/#primaryimage"},"thumbnailUrl":"https:\/\/quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image2-1.png","articleSection":["All"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/","url":"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/","name":"Java multi-threading in EspressChart API - Quadbase Systems Inc.","isPartOf":{"@id":"https:\/\/www.quadbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/#primaryimage"},"image":{"@id":"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/#primaryimage"},"thumbnailUrl":"https:\/\/quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image2-1.png","datePublished":"2023-06-09T12:08:03+00:00","dateModified":"2023-06-21T20:10:34+00:00","breadcrumb":{"@id":"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/#primaryimage","url":"https:\/\/quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image2-1.png","contentUrl":"https:\/\/quadbase.com\/blog\/wp-content\/uploads\/2023\/06\/image2-1.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.quadbase.com\/blog\/java-multi-threading-in-espresschart-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"HOME","item":"https:\/\/www.quadbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Java multi-threading in EspressChart API"}]},{"@type":"WebSite","@id":"https:\/\/www.quadbase.com\/blog\/#website","url":"https:\/\/www.quadbase.com\/blog\/","name":"Quadbase Systems Inc.","description":"Company blog about enterprise reporting, java charts, business intelligence.","publisher":{"@id":"https:\/\/www.quadbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.quadbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.quadbase.com\/blog\/#organization","name":"Quadbase Systems Inc.","url":"https:\/\/www.quadbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.quadbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.quadbase.com\/blog\/wp-content\/uploads\/2023\/09\/Method-Draw-Image27.png","contentUrl":"https:\/\/www.quadbase.com\/blog\/wp-content\/uploads\/2023\/09\/Method-Draw-Image27.png","width":199,"height":90,"caption":"Quadbase Systems Inc."},"image":{"@id":"https:\/\/www.quadbase.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/QuadbaseSystemsInc\/","https:\/\/x.com\/Quadbase","https:\/\/www.youtube.com\/user\/QuadbaseSystems"]},{"@type":"Person","@id":"https:\/\/www.quadbase.com\/blog\/#\/schema\/person\/547fc659bc4b72e45049ed279a4fadc8","name":"quadbase","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/14148ecbe810a872c3aa322d49f590829742ea41bc80e6bbd234b131fcfa0746?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/14148ecbe810a872c3aa322d49f590829742ea41bc80e6bbd234b131fcfa0746?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/14148ecbe810a872c3aa322d49f590829742ea41bc80e6bbd234b131fcfa0746?s=96&d=mm&r=g","caption":"quadbase"},"url":"https:\/\/www.quadbase.com\/blog\/author\/quadbase\/"}]}},"_links":{"self":[{"href":"https:\/\/www.quadbase.com\/blog\/wp-json\/wp\/v2\/posts\/444","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.quadbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.quadbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.quadbase.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.quadbase.com\/blog\/wp-json\/wp\/v2\/comments?post=444"}],"version-history":[{"count":5,"href":"https:\/\/www.quadbase.com\/blog\/wp-json\/wp\/v2\/posts\/444\/revisions"}],"predecessor-version":[{"id":454,"href":"https:\/\/www.quadbase.com\/blog\/wp-json\/wp\/v2\/posts\/444\/revisions\/454"}],"wp:attachment":[{"href":"https:\/\/www.quadbase.com\/blog\/wp-json\/wp\/v2\/media?parent=444"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.quadbase.com\/blog\/wp-json\/wp\/v2\/categories?post=444"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.quadbase.com\/blog\/wp-json\/wp\/v2\/tags?post=444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}