{"componentChunkName":"component---node-modules-carrotsearch-gatsby-theme-apidocs-templates-documentation-page-js","path":"/java-concurrency/","result":{"data":{"html":{"frontmatter":{"id":"java-concurrency","title":"Concurrency"},"html":"<article>\n  <h1>Concurrency</h1>\n\n  <p id=\"12afe8f5\">\n    If you intend to run Lingo3G clustering in parallel threads, make sure your\n    code follows the concurrency guidelines outlined in this article.\n  </p>\n\n  <section id=\"thread-safety\">\n    <h2>\n        <a class=\"anchor\" href=\"#thread-safety\" aria-hidden=\"true\"><svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"/></svg></a>Thread-safety\n      </h2>\n\n    <p id=\"thread-safety:57e31444\">\n      Lingo3G Java API follows the following contracts with respect to\n      thread-safety:\n    </p>\n\n    <ul>\n      <li>\n        <p id=\"thread-safety:a24a5d86\">\n          <code>Lingo3GClusteringAlgorithm</code> instances are\n          <strong>not thread-safe</strong> – your code\n          <strong>must not</strong>\n          share them among parallel threads.\n        </p>\n      </li>\n\n      <li>\n        <p id=\"thread-safety:069cba9d\">\n          <code>LanguageComponents</code> instance\n          <strong>is thread-safe</strong> – your code\n          <strong>should</strong> share and reused it among parallel threads.\n        </p>\n      </li>\n    </ul>\n\n    <p id=\"thread-safety:cc07f1b1\">\n      In other words, if your code needs to cluster data in parallel threads,\n      each thread should \"own\" its own\n      <code>Lingo3GClusteringAlgorithm</code> instance. All threads should reuse\n      the same<code>LanguageComponent</code> instance loaded beforehand.\n    </p>\n\n    <p id=\"thread-safety:2cfaede1\">\n      The following sections show two approaches to configuring Lingo3G\n      algorithm instance once and then reusing it in subsequent, possibly\n      concurrent, clustering calls.\n    </p>\n  </section>\n\n  <section id=\"ephemeral-instances\">\n    <h2>\n        <a class=\"anchor\" href=\"#ephemeral-instances\" aria-hidden=\"true\"><svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"/></svg></a>Ephemeral instances\n      </h2>\n\n    <p id=\"ephemeral-instances:651046e8\">\n      The simplest way to ensure thread-safety is to create and configure a\n      <code>Lingo3GClusteringAlgorithm</code>\n      instance on the fly and discard it after the clustering completes.\n    </p>\n\n    <p id=\"ephemeral-instances:152604b5\">\n      The following example defines a function that transforms a stream of\n      documents into a list of clusters:\n    </p>\n\n    <figure id=\"ephemeral-instances:example\">\n      <div class=\"gatsby-highlight\">\n    <pre class=\"language-java\"><code data-language=\"java\"><span class=\"token comment\">// Load one language components instance for sharing among all parallel threads.</span>\n<span class=\"token class-name\">LanguageComponents</span> english <span class=\"token operator\">=</span> <span class=\"token class-name\">LanguageComponents</span><span class=\"token punctuation\">.</span><span class=\"token function\">loader</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">load</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">language</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"English\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Document stream -> cluster list function.</span>\n<span class=\"token class-name\">Function</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Stream</span><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Document</span><span class=\"token punctuation\">></span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">List</span><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Cluster</span><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Document</span><span class=\"token punctuation\">></span><span class=\"token punctuation\">></span><span class=\"token punctuation\">></span></span> processor <span class=\"token operator\">=</span>\n    <span class=\"token punctuation\">(</span>documentStream<span class=\"token punctuation\">)</span> <span class=\"token operator\">-></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// Algorithm instances are created per-call (per-thread)</span>\n      <span class=\"token class-name\">Lingo3GClusteringAlgorithm</span> algorithm <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Lingo3GClusteringAlgorithm</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token comment\">// ...configured in place</span>\n      algorithm<span class=\"token punctuation\">.</span>documents<span class=\"token punctuation\">.</span>phraseDfThresholdScalingFactor<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token number\">0.1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      algorithm<span class=\"token punctuation\">.</span>hierarchy<span class=\"token punctuation\">.</span>maxHierarchyDepth<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token comment\">// and discarded once clustering call completes.</span>\n      <span class=\"token keyword\">return</span> algorithm<span class=\"token punctuation\">.</span><span class=\"token function\">cluster</span><span class=\"token punctuation\">(</span>documentStream<span class=\"token punctuation\">,</span> english<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">runConcurrentClustering</span><span class=\"token punctuation\">(</span>processor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre>\n  </div>\n\n      <figcaption>\n        <p>\n          Calling clustering in multiple threads using disposable clustering\n          algorithm instances in Java API.\n        </p>\n      </figcaption>\n    </figure>\n\n    <p id=\"ephemeral-instances:b8d90e4a\">\n      Note that the code loads a <code>LanguageComponents</code> instance once\n      and then shares it among all parallel threads for reuse.\n    </p>\n  </section>\n\n  <section id=\"cloning\">\n    <h2>\n        <a class=\"anchor\" href=\"#cloning\" aria-hidden=\"true\"><svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"/></svg></a>Cloning preconfigured instances\n      </h2>\n\n    <p id=\"cloning:f665105a\">\n      If the configuration of your <code>Lingo3GClusteringAlgorithm</code>\n      instance is complex or you would like to decouple it from the actual\n      clustering, your code can do the following:\n    </p>\n\n    <ol>\n      <li>\n        <p id=\"cloning:514a1646\">\n          Create and configure a \"blueprint\"\n          <code>Lingo3GClusteringAlgorithm</code>\n          instance.\n        </p>\n      </li>\n\n      <li>\n        <p id=\"cloning:5e8b3a74\">\n          Use the <code>Attrs.toMap</code> method to convert the \"blueprint\"\n          instance into a <code>Map</code> for sharing among concurrent threads.\n        </p>\n      </li>\n\n      <li>\n        <p id=\"cloning:2d66270b\">\n          In each thread, use the <code>Attrs.fromMap</code> method to create a\n          clone of the \"blueprint\" instance.\n        </p>\n      </li>\n    </ol>\n\n    <p id=\"cloning:a7423271\">The following example demonstrates this approach:</p>\n\n    <figure id=\"cloning:example\">\n      <div class=\"gatsby-highlight\">\n    <pre class=\"language-java\"><code data-language=\"java\"><span class=\"token comment\">// Apply any configuration tweaks once.</span>\n<span class=\"token class-name\">Lingo3GClusteringAlgorithm</span> preconfigured <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Lingo3GClusteringAlgorithm</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\npreconfigured<span class=\"token punctuation\">.</span>documents<span class=\"token punctuation\">.</span>phraseDfThresholdScalingFactor<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token number\">0.1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\npreconfigured<span class=\"token punctuation\">.</span>hierarchy<span class=\"token punctuation\">.</span>maxHierarchyDepth<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Populate the map with algorithm and its attributes.</span>\n<span class=\"token class-name\">Map</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Object</span><span class=\"token punctuation\">></span></span> attrs <span class=\"token operator\">=</span> <span class=\"token class-name\">Attrs</span><span class=\"token punctuation\">.</span><span class=\"token function\">toMap</span><span class=\"token punctuation\">(</span>preconfigured<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Reuse the previously populated map to create a new cloned instance.</span>\n<span class=\"token class-name\">Function</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Stream</span><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Document</span><span class=\"token punctuation\">></span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">List</span><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Cluster</span><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Document</span><span class=\"token punctuation\">></span><span class=\"token punctuation\">></span><span class=\"token punctuation\">></span></span> processor <span class=\"token operator\">=</span>\n    <span class=\"token punctuation\">(</span>documentStream<span class=\"token punctuation\">)</span> <span class=\"token operator\">-></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token class-name\">Lingo3GClusteringAlgorithm</span> cloned<span class=\"token punctuation\">;</span>\n      cloned <span class=\"token operator\">=</span> <span class=\"token class-name\">Attrs</span><span class=\"token punctuation\">.</span><span class=\"token function\">fromMap</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Lingo3GClusteringAlgorithm</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> attrs<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span> cloned<span class=\"token punctuation\">.</span><span class=\"token function\">cluster</span><span class=\"token punctuation\">(</span>documentStream<span class=\"token punctuation\">,</span> english<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">runConcurrentClustering</span><span class=\"token punctuation\">(</span>processor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre>\n  </div>\n\n      <figcaption>\n        <p>\n          Calling clustering in multiple threads by cloning a preconfigured\n          clustering algorithm instance in Java API.\n        </p>\n      </figcaption>\n    </figure>\n\n    <p id=\"cloning:6debd935\">\n      Note that the parallel threads do not use the \"blueprint\" instance\n      directly as it is not thread-safe. Instead, they create a disposable clone\n      for each clustering call.\n    </p>\n  </section>\n</article>","tableOfContents":[{"heading":"Thread-safety","anchor":"thread-safety"},{"heading":"Ephemeral instances","anchor":"ephemeral-instances"},{"heading":"Cloning preconfigured instances","anchor":"cloning"}]}},"pageContext":{"slug":"/java-concurrency/"}},"staticQueryHashes":["1164750013"]}