{"id":217899,"date":"2014-04-03T03:32:02","date_gmt":"2014-04-02T23:32:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=217899"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=217899","title":{"rendered":"<span class=\"post_title\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0410\u043a\u0442\u043e\u0440\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Java\/GPars, \u0427\u0430\u0441\u0442\u044c I<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t\u041a\u0440\u0430\u0442\u043a\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f API \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"http:\/\/gpars.codehaus.org\/\">GPars<\/a> \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0432 \u00ab\u043d\u0430\u0440\u043e\u0434\u043d\u043e\u043c \u0445\u043e\u0437\u044f\u0439\u0441\u0442\u0432\u0435\u00bb.<\/p>\n<p>  \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0445\u043e\u0434\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0430\u043a\u0442\u043e\u0440\u043e\u0432, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 Java-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0443, \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043a \u0447\u0442\u0435\u043d\u0438\u044e \u043a\u0443\u0440\u0441\u0430 <a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/217051\/\">\u00abMulticore programming in Java\u00bb<\/a>.<\/p>\n<p>  \u042d\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u0441\u0442\u0430\u0442\u0435\u0439 \u0446\u0435\u043b\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c API, \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0430\u043a\u0442\u043e\u0440\u043e\u0432 Akka \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445 \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435. \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0442\u0430\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 GPars. <\/p>\n<p>  GPars \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0434\u043b\u044f Clojure \u0441 \u0448\u0438\u0440\u043e\u043a\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u043c.<br \/>  \u041f\u043b\u044e\u0441\u044b GPars  <\/p>\n<ul>\n<li>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Java (\u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 Akka, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 Scala). \u0412\u0441\u0435\u0433\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u00ab\u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u00bb \u043d\u0430 \u00ab\u0440\u043e\u0434\u043d\u043e\u043c\u00bb \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/li>\n<li>GPars \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0446\u0435\u043b\u044b\u0439 \u00ab\u0437\u043e\u043e\u043f\u0430\u0440\u043a\u00bb \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 (Actor, Agent, STM, CSP, Dataflow)<\/li>\n<li>GPars \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u0437 runtime-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Clojure, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 Java. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f<\/li>\n<\/ul>\n<p>  <a name=\"habracut\"><\/a>  <\/p>\n<h4>\u00ab\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u00bb GPars<\/h4>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0435 \u0432 Maven GPars \u0438 Groovy  <\/p>\n<pre><code>&lt;dependency&gt;     &lt;groupId&gt;org.codehaus.gpars&lt;\/groupId&gt;     &lt;artifactId&gt;gpars&lt;\/artifactId&gt;     &lt;version&gt;1.1.0&lt;\/version&gt; &lt;\/dependency&gt; &lt;dependency&gt;     &lt;groupId&gt;org.codehaus.groovy&lt;\/groupId&gt;     &lt;artifactId&gt;groovy-all&lt;\/artifactId&gt;     &lt;version&gt;2.2.2&lt;\/version&gt; &lt;\/dependency&gt; <\/code><\/pre>\n<p>  \u0411\u0435\u0437 Maven \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f <a href=\"http:\/\/search.maven.org\/remotecontent?filepath=org\/codehaus\/gpars\/gpars\/1.1.0\/gpars-1.1.0.jar\">GPars-1.1.0<\/a> (<a href=\"http:\/\/search.maven.org\/remotecontent?filepath=org\/codehaus\/gpars\/gpars\/1.1.0\/gpars-1.1.0-sources.jar\">sources<\/a>) \u0438 <a href=\"http:\/\/search.maven.org\/remotecontent?filepath=org\/codehaus\/groovy\/groovy-all\/2.2.2\/groovy-all-2.2.2.jar\">Groovy-2.2.2<\/a> (<a href=\"http:\/\/search.maven.org\/remotecontent?filepath=org\/codehaus\/groovy\/groovy-all\/2.2.2\/groovy-all-2.2.2-sources.jar\">sources<\/a>) \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0439\u0442\u0435 \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443.<\/p>\n<h4>Stateless Actor<\/h4>\n<p>  \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 (\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0446\u0435 \u2014 \u0442\u0430\u043a \u0432\u0441\u0435 \u0438 \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043e)  <\/p>\n<pre><code>import groovyx.gpars.MessagingRunnable; import groovyx.gpars.actor.*;  public class StatelessActorTest {     public static void main(String[] args) throws Exception {         Actor actor = new MyStatelessActor().start();         \/\/ \u043c\u043e\u0433\u0443 \u043f\u043e\u0441\u043b\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0439\u0442\u0438 \u0434\u0430\u043b\u044c\u0448\u0435         actor.send(&quot;Hello&quot;);         \/\/ \u043c\u043e\u0433\u0443 \u043f\u043e\u0441\u043b\u0430\u0442\u044c \u0438 \u0436\u0434\u0430\u0442\u044c &quot;\u043e\u0442\u0432\u0435\u0442\u0430&quot;         System.err.println(&quot;main(...): &quot; + actor.sendAndWait(42));         \/\/ \u043c\u043e\u0433\u0443 \u043f\u043e\u0441\u043b\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043f\u043e\u0432\u0435\u0441\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438 \u043f\u043e\u0439\u0442\u0438 \u0434\u0430\u043b\u044c\u0448\u0435         actor.sendAndContinue(10.0, new MessagingRunnable&lt;Object&gt;() {             protected void doRun(final Object response) {                 System.err.println(&quot;main(...): &quot; + response);             }         });         \/\/ \u0436\u0434\u0435\u043c         System.in.read();     }      private static class MyStatelessActor extends DynamicDispatchActor {         public void onMessage(final String msg) {             System.err.println(&quot;onMessage(String): &quot; + msg);             \/\/ \u043c\u043e\u0433\u0443 \u041d\u0415 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c sender-\u0443         }         public void onMessage(final Integer msg) {             System.err.println(&quot;onMessage(Integer): &quot; + msg);             \/\/ \u043c\u043e\u0433\u0443 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c sender-\u0443             reply(1000 + msg);         }     } } &gt;&gt; onMessage(String): Hello &gt;&gt; onMessage(Integer): 42 &gt;&gt; main(...): 1042 &gt;&gt; An exception occurred in the Actor thread Actor Thread 1 &gt;&gt; groovy.lang.MissingMethodException: No signature of method: &gt;&gt; StatelessActorTest$MyStatelessActor.onMessage() is applicable for argument types: (java.lang.Double) values: [10.0] &gt;&gt; Possible solutions: onMessage(java.lang.Integer), onMessage(java.lang.String) &gt;&gt;         at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(... &gt;&gt;         ... &gt;&gt;         ... <\/code><\/pre>\n<p>  \u0427\u0442\u043e \u0432\u0438\u0434\u043d\u043e<br \/>   \u2014 \u00abpattern matching\u00bb \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u043e\u0434\u0431\u043e\u0440\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e (overloaded) \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 onMessage(&lt;one-arg&gt;), \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u043e\u0433\u043e \u043d\u0435\u0442, \u0442\u043e \u00ab\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u00bb \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<br \/>   \u2014 \u0430\u043a\u0442\u043e\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0443\u043b\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432-\u00ab\u0434\u0435\u043c\u043e\u043d\u043e\u0432\u00bb, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043a\u0430\u043a-\u0442\u043e \u043f\u043e\u0434\u0432\u0435\u0441\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u0435\u0442\u043e\u0434\u0430 main() (\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b System.in.read()) \u0441 \u0446\u0435\u043b\u044c\u044e \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043f\u0440\u0435\u0436\u0434\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b JVM<br \/>   \u2014 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 reply() \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0442 DynamicDispatchActor \u0432 \u00ab\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d\u00bb \u0430\u043a\u0442\u043e\u0440\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 (reply, replyIfExists, getSender, terminate, &#8230;)<\/p>\n<p>  \u0425\u043e\u0442\u044f \u0430\u0432\u0442\u043e\u0440\u044b GPars \u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 DynamicDispatchActor \u2014 <a href=\"http:\/\/gpars.org\/guide\/guide\/actors.html#actors_statelessActors\">\u0430\u043a\u0442\u043e\u0440\u0430\u043c\u0438-\u0431\u0435\u0437-\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f (stateless actor)<\/a>, \u044d\u0442\u043e \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b java-\u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u043c\u0443\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u044f \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043d\u0438\u0445 \u0441\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u041f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u043e  <\/p>\n<pre><code>import groovyx.gpars.actor.*;  import java.util.ArrayList; import java.util.List;  public class StatelessActorTest {     public static void main(String[] args) throws InterruptedException {         Actor actor = new DynamicDispatchActor() {             private final List&lt;Double&gt; state = new ArrayList&lt;&gt;();             public void onMessage(final Double msg) {                 state.add(msg);                 reply(state);             }         }.start();          System.out.println(&quot;answer: &quot; + actor.sendAndWait(1.0));         System.out.println(&quot;answer: &quot; + actor.sendAndWait(2.0));         System.out.println(&quot;answer: &quot; + actor.sendAndWait(3.0));         System.out.println(&quot;answer: &quot; + actor.sendAndWait(4.0));         System.out.println(&quot;answer: &quot; + actor.sendAndWait(5.0));     } } &gt;&gt; answer: [1.0] &gt;&gt; answer: [1.0, 2.0] &gt;&gt; answer: [1.0, 2.0, 3.0] &gt;&gt; answer: [1.0, 2.0, 3.0, 4.0] &gt;&gt; answer: [1.0, 2.0, 3.0, 4.0, 5.0] <\/code><\/pre>\n<h4>Statefull Actor<\/h4>\n<p>  \u0412\u0432\u043e\u0434\u044f \u0434\u0435\u043b\u0435\u043d\u0438\u0435 stateless\/statefull, \u0430\u0432\u0442\u043e\u0440\u044b \u0438\u043c\u0435\u044e \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e Statefull Actor \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043e\u0440\u0433\u0430\u043d\u0438\u0447\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 State. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 (\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0438 DefaultActor \u2014 Statefull Actor-\u044b)  <\/p>\n<pre><code>import groovyx.gpars.MessagingRunnable; import groovyx.gpars.actor.*;  import static java.util.Arrays.asList;  public class StatefulActorTest {     public static void main(String[] args) throws Exception {         Actor actor = new MyStatefulActor().start();          actor.send(&quot;A&quot;);         actor.send(1.0);         actor.send(Arrays.asList(1, 2, 3));          actor.send(&quot;B&quot;);         actor.send(2.0);         actor.send(Arrays.asList(4, 5, 6));          System.in.read();     }      private static class MyStatefulActor extends DefaultActor {         protected void act() {             loop(new Runnable() {                 public void run() {                     react(new MessagingRunnable&lt;Object&gt;(this) {                         protected void doRun(final Object msg) {                             System.out.println(&quot;react: &quot; + msg);                         }                     });                 }             });         }     } } &gt;&gt; react: A &gt;&gt; react: 1.0 &gt;&gt; react: [1, 2, 3] &gt;&gt; react: B &gt;&gt; react: 2.0 &gt;&gt; react: [4, 5, 6] <\/code><\/pre>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e, \u043e\u0431\u0435\u0449\u0430\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 State \u0441\u043e\u0432\u0441\u0435\u043c \u00ab\u043d\u0435 \u043f\u0430\u0445\u043d\u0435\u0442\u00bb. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u0439\u0434\u0435\u043c \u0441 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b (Java \u043d\u0435 \u043b\u0443\u0447\u0448\u0438\u0439 \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0442\u0440\u044e\u043a\u043e\u0432, \u043d\u0430 Clojure\/Scala \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0435)  <\/p>\n<pre><code>import groovyx.gpars.MessagingRunnable; import groovyx.gpars.actor.*;  import java.util.List; import static java.util.Arrays.asList;  public class StatefulActorTest {     public static void main(String[] args) throws Exception {         Actor actor = new MyStatefulActor().start();          actor.send(&quot;A&quot;);         actor.send(1.0);         actor.send(asList(1, 2, 3));          actor.send(&quot;B&quot;);         actor.send(2.0);         actor.send(asList(4, 5, 6));          System.in.read();     }      private static class MyStatefulActor extends DefaultActor {       protected void act() {         loop(new Runnable() {           public void run() {             react(new MessagingRunnable&lt;String&gt;(this) {               protected void doRun(final String msg) {                 System.out.println(&quot;Stage #0: &quot; + msg);                 react(new MessagingRunnable&lt;Double&gt;() {                   protected void doRun(final Double msg) {                     System.out.println(&quot;  Stage #1: &quot; + msg);                     react(new MessagingRunnable&lt;List&lt;Integer&gt;&gt;() {                       protected void doRun(final List&lt;Integer&gt; msg) {                         System.out.println(&quot;    Stage #2: &quot; + msg + &quot;\\n&quot;);                       }                   });                 }               });             }           });         }       });     }   } } &gt;&gt; Stage #0: A &gt;&gt;   Stage #1: 1.0 &gt;&gt;     Stage #2: [1, 2, 3] &gt;&gt;  &gt;&gt; Stage #0: B &gt;&gt;   Stage #1: 2.0 &gt;&gt;     Stage #2: [4, 5, 6] <\/code><\/pre>\n<p>  \u041d\u0443 \u0438\u043b\u0438 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u043e\u0442 \u044d\u0442\u043e\u0439 \u0436\u0443\u0434\u043a\u043e\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u00ab\u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u00bb  <\/p>\n<pre><code>import groovyx.gpars.MessagingRunnable; import groovyx.gpars.actor.*;  import java.util.List; import static java.util.Arrays.asList;  public class StatefulActorTest {     public static void main(String[] args) throws Exception {         Actor actor = new MyStatefulActor().start();          actor.send(&quot;A&quot;);         actor.send(1.0);         actor.send(asList(1, 2, 3));          actor.send(&quot;B&quot;);         actor.send(2.0);         actor.send(asList(4, 5, 6));          System.in.read();     }      private static class MyStatefulActor extends DefaultActor {         protected void act() {             loop(new Runnable() {                 public void run() {                     react(new Stage0(MyStatefulActor.this));                 }             });         }     }      private static class Stage0 extends MessagingRunnable&lt;String&gt; {         private final DefaultActor owner;         private Stage0(DefaultActor owner) {this.owner = owner;}          protected void doRun(final String msg) {             System.out.println(&quot;Stage #0: &quot; + msg);             owner.react(new Stage1(owner));         }     }      private static class Stage1 extends MessagingRunnable&lt;Double&gt; {         private final DefaultActor owner;         private Stage1(DefaultActor owner) {this.owner = owner;}          protected void doRun(final Double msg) {             System.out.println(&quot;  Stage #1: &quot; + msg);             owner.react(new Stage2());         }     }      private static class Stage2 extends MessagingRunnable&lt;List&lt;Integer&gt;&gt; {         protected void doRun(final List&lt;Integer&gt; msg) {             System.out.println(&quot;    Stage #2: &quot; + msg + &quot;\\n&quot;);         }     } } <\/code><\/pre>\n<p>  \u0414\u0430, \u0434\u0430, \u044f \u0441 \u0412\u0430\u043c\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0433\u043b\u0430\u0441\u0435\u043d, Java \u2014 \u043a\u0440\u0430\u0439\u043d\u0435 \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u044f\u0437\u044b\u043a.<\/p>\n<p>  \u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 (\u0440\u0430\u0437\u0432\u0438\u043b\u043e\u043a \u043f\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0443 \u043c\u044b \u043d\u0435 \u0434\u0435\u043b\u0430\u043b\u0438)  <\/p>\n<pre><code>\/\/ START \/\/ -----   \/\/   | \/\/   | \/\/   | \/\/   |  +--------+ \/\/   +-&gt;| Stage0 | ---String----+ \/\/      +--------+              | \/\/         ^                    v \/\/         |                +--------+ \/\/         |                | Stage1 | \/\/   List&lt;Integer&gt;          +--------+ \/\/         |                    | \/\/         |  +--------+      Double \/\/         +--| Stage2 |&lt;-------+ \/\/            +--------+ <\/code><\/pre>\n<h4>\u0422\u0430\u0439\u043c\u0435\u0440<\/h4>\n<p>  \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0442\u0430\u0439\u043c\u0435\u0440 \u2014 \u043d\u0435\u0447\u0442\u043e, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u043e\u0432\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0435\u043d\u044f \u043e\u0431 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0412 \u00ab\u043e\u0431\u044b\u0447\u043d\u043e\u0439\u00bb Java \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c java.util.concurrent.ScheduledThreadPoolExecutor \u0438\u043b\u0438 java.util.Timer \u043d\u0430 \u0445\u0443\u0434\u043e\u0439 \u043a\u043e\u043d\u0435\u0446. \u041d\u043e \u043c\u044b \u0436\u0435 \u0432 \u043c\u0438\u0440\u0435 \u0430\u043a\u0442\u043e\u0440\u043e\u0432!<br \/>  \u042d\u0442\u043e Statefull Actor, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0438\u0441\u0438\u0442 \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 react() \u0441 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c. \u0415\u0441\u043b\u0438 \u043d\u0438\u043a\u0430\u043a\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0442\u043e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 GPars \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0435\u0442 \u043d\u0430\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 Actor.TIMEOUT (\u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430 \u00abTIMEOUT\u00bb) \u0438 \u043c\u044b \u00ab\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u00bb \u043d\u0430\u0448\u0435\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 timeoutMsg. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u00ab\u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u00bb \u0442\u0430\u0439\u043c\u0435\u0440 \u2014 \u043f\u0440\u0438\u0448\u043b\u0438\u0442\u0435 \u0435\u043c\u0443 \u043b\u044e\u0431\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 (\u044f \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0442\u044c \u0435\u043c\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u00abKILL\u00bb)  <\/p>\n<pre><code>import groovyx.gpars.MessagingRunnable; import groovyx.gpars.actor.*; import groovyx.gpars.actor.impl.MessageStream;  import static java.util.concurrent.TimeUnit.MILLISECONDS;  public class Timer&lt;T&gt; extends DefaultActor {     private final long timeout;     private final T timeoutMsg;     private final MessageStream replyTo;      public Timer(long timeout, T timeoutMsg, MessageStream replyTo) {         this.timeout = timeout;         this.timeoutMsg = timeoutMsg;         this.replyTo = replyTo;     }      protected void act() {         loop(new Runnable() {             public void run() {                 react(timeout, MILLISECONDS, new MessagingRunnable() {                     protected void doRun(Object argument) {                         if (Actor.TIMEOUT.equals(argument)) {                             replyTo.send(timeoutMsg);                         }                         terminate();                     }                 });             }         });     } } <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043c\u0435\u0440\u0430.<br \/>  \u042f \u0441\u043e\u0437\u0434\u0430\u044e \u0434\u0432\u0430 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 timerX \u0438 timerY, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439 1000\u043c\u0441 \u0432\u044b\u0448\u043b\u044e\u0442 \u043c\u043d\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u00abX\u00bb \u0438 \u00abY\u00bb \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041d\u043e \u0447\u0435\u0440\u0435\u0437 500\u043c\u0441 \u044f \u043f\u0435\u0440\u0435\u0434\u0443\u043c\u0430\u043b \u0438 \u00ab\u043f\u0440\u0438\u0431\u0438\u043b\u00bb timerX.  <\/p>\n<pre><code>import groovyx.gpars.actor.Actor; import groovyx.gpars.actor.impl.MessageStream;  public class TimerDemo {     public static void main(String[] args) throws Exception {         Actor timerX = new Timer&lt;&gt;(1000, &quot;X&quot;, new MessageStream() {             public MessageStream send(Object msg) {                 System.out.println(&quot;timerX send timeout message: '&quot; + msg + &quot;'&quot;);                 return this;             }         }).start();         Actor timerY = new Timer&lt;&gt;(1000, &quot;Y&quot;, new MessageStream() {             public MessageStream send(Object msg) {                 System.out.println(&quot;timerY send timeout message: '&quot; + msg + &quot;'&quot;);                 return this;             }         }).start();                  Thread.sleep(500);         timerX.send(&quot;KILL&quot;);                  System.in.read();     } } &gt;&gt; timerY send timeout message: 'Y' <\/code><\/pre>\n<h4>\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0441\u0445\u0435\u043c\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h4>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0432\u0435\u0441\u044c\u043c\u0430 \u043e\u0431\u0449\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443.<br \/>  1. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e.<br \/>  2. \u0423 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430: \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<br \/>  3. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0430\u043a\u043e\u0432\u0430, \u0447\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0447\u0435\u043c \u0441\u0443\u043c\u043c\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043e\u043a \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<br \/>  4. \u0417\u0430\u0434\u0430\u0447\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u044b \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 Batcher, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043e\u0442 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432 \u00ab\u043f\u0430\u0447\u043a\u0443\u00bb, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a, Batcher \u00ab\u0440\u0430\u0437\u0434\u0430\u0435\u0442\u00bb \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0442\u043e\u043a\u0430\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f\u043c.<br \/>  5. Batcher \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0434\u0432\u0443\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445: \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u00ab\u043f\u0430\u0447\u043a\u0443\u00bb \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438\u043b\u0438 \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f, \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u0443\u044e \u00ab\u043f\u0430\u0447\u043a\u0443\u00bb, \u043d\u043e \u043f\u043e\u0442\u043e\u043a\u0430\u043c \u0443\u0436\u0435 \u043f\u043e\u0440\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b.<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0445\u0435\u043c\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<br \/>  \u0422\u0430\u0439\u043c\u0430\u0443\u0442 100\u043c\u0441, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u00ab\u043f\u0430\u0447\u043a\u0438\u00bb \u2014 3 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430<\/p>\n<p>  \u0412 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 0 \u043f\u043e\u0442\u043e\u043a T-0 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u00abA\u00bb. Batcher \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u00ab\u0447\u0438\u0441\u0442\u043e\u043c\u00bb \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435 0  <\/p>\n<pre><code>\/\/time:0 \/\/ \/\/  T-0 --&quot;A&quot;-----&gt;     +-------+ generationId=0 \/\/  T-1                 |Batcher| argList=[] \/\/  T-2                 +-------+ replyToList=[] <\/code><\/pre>\n<p>  \u0421\u043f\u0443\u0441\u0442\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u0438\u0435 Batcher \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u043e\u0431\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u00abA\u00bb \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0443 T-0. \u0417\u0430\u0432\u0435\u0434\u0435\u043d \u0442\u0430\u0439\u043c\u0435\u0440 \u0434\u043b\u044f \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f 0  <\/p>\n<pre><code>\/\/                                    +-----+ timeoutMsg=0 \/\/                                    |Timer| timeout=100 \/\/time:0.001                          +-----+ \/\/ \/\/  T-0                 +-------+ generationId=0 \/\/  T-1                 |Batcher| argList=[&quot;A&quot;] \/\/  T-2                 +-------+ replyToList=[T-0] <\/code><\/pre>\n<p>  \u0412 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 25 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e\u0442\u043e\u043a T-1 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u00abB\u00bb  <\/p>\n<pre><code>\/\/                                    +-----+ timeoutMsg=0 \/\/                                    |Timer| timeout=100 \/\/time:25                             +-----+ \/\/ \/\/  T-0                 +-------+ generationId=0 \/\/  T-1 ---&quot;B&quot;----&gt;     |Batcher| argList=[&quot;A&quot;] \/\/  T-2                 +-------+ replyToList=[T-0] <\/code><\/pre>\n<p>  \u0421\u043f\u0443\u0441\u0442\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u0438\u0435 Batcher \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u043e\u0431\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u00abA\u00bb \u0438 \u00abB\u00bb \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0430\u043c T-0 \u0438 T-1  <\/p>\n<pre><code>\/\/                                    +-----+ timeoutMsg=0 \/\/                                    |Timer| timeout=100 \/\/time:25.001                         +-----+ \/\/ \/\/  T-0                 +-------+ generationId=0 \/\/  T-1                 |Batcher| argList=[&quot;A&quot;,&quot;B&quot;] \/\/  T-2                 +-------+ replyToList=[T-0,T-1] <\/code><\/pre>\n<p>  \u0412 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 50 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e\u0442\u043e\u043a T-2 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u00ab\u0421\u00bb  <\/p>\n<pre><code>\/\/                                    +-----+ timeoutMsg=0 \/\/                                    |Timer| timeout=100 \/\/time:50                             +-----+ \/\/ \/\/  T-0                 +-------+ generationId=0 \/\/  T-1                 |Batcher| argList=[&quot;A&quot;,&quot;B&quot;] \/\/  T-2 ----&quot;C&quot;---&gt;     +-------+ replyToList=[T-0,T-1] <\/code><\/pre>\n<p>  \u0421\u043f\u0443\u0441\u0442\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u0438\u0435 Batcher \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u043e\u0431\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u00abA\u00bb, \u00abB\u00bb \u0438 \u00abC\u00bb \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0430\u043c T-0, T-1 \u0438 T-2. \u0412\u044b\u044f\u0441\u043d\u044f\u0435\u0442, \u0447\u0442\u043e \u00ab\u043f\u0430\u0447\u043a\u0430\u00bb \u043d\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0438 \u00ab\u0443\u0431\u0438\u0432\u0430\u0435\u0442\u00bb \u0442\u0430\u0439\u043c\u0435\u0440  <\/p>\n<pre><code>\/\/                                    +-----+ timeoutMsg=0 \/\/                          +-&quot;KILL&quot;-&gt;|Timer| timeout=100 \/\/time:50.001               |         +-----+ \/\/                          | \/\/  T-0                 +-------+ generationId=0 \/\/  T-1                 |Batcher| argList=[&quot;A&quot;,&quot;B&quot;,&quot;C&quot;] \/\/  T-2                 +-------+ replyToList=[T-0,T-1,T-2] <\/code><\/pre>\n<p>  \u0421\u043f\u0443\u0441\u0442\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u0438\u0435 Batcher \u043e\u0442\u0434\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043e\u0431\u0441\u0447\u0435\u0442 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u0430\u043a\u0442\u043e\u0440\u0443 (anonimous), \u043e\u0447\u0438\u0449\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435 \u0441 0 \u043d\u0430 1  <\/p>\n<pre><code>\/\/time:50.002 \/\/ \/\/  T-0                 +-------+ generationId=1 \/\/  T-1                 |Batcher| argList=[] \/\/  T-2                 +-------+ replyToList=[] \/\/ \/\/                                 +---------+ argList=[&quot;A&quot;,&quot;B&quot;,&quot;C&quot;] \/\/                                 |anonymous| replyToList=[T-0,T-1,T-2] \/\/                                 +---------+ <\/code><\/pre>\n<p>  \u0421\u043f\u0443\u0441\u0442\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u0438\u0435 (\u0434\u043b\u044f \u00ab\u0440\u0430\u0441\u043a\u0430\u0434\u0440\u043e\u0432\u043a\u0438\u00bb \u0431\u0443\u0434\u0443 \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u044b) \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0439 \u0430\u043a\u0442\u043e\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0430\u0434 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 [\u00abA\u00bb,\u00abB\u00bb,\u00abC\u00bb] -&gt; [\u00abre#A\u00bb,\u00abres#B\u00bb,\u00abres#C\u00bb]  <\/p>\n<pre><code>\/\/time:50.003 \/\/ \/\/  T-0                 +-------+ generationId=1 \/\/  T-1                 |Batcher| argList=[] \/\/  T-2                 +-------+ replyToList=[] \/\/ \/\/                                 +---------+ resultList=[&quot;res#A&quot;,&quot;res#B&quot;,&quot;res#B&quot;] \/\/                                 |anonymous| replyToList=[T-0,T-1,T-2] \/\/                                 +---------+ <\/code><\/pre>\n<p>  \u0421\u043f\u0443\u0441\u0442\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0439 \u0430\u043a\u0442\u0435\u0440 \u0440\u0430\u0437\u0434\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430\u043c  <\/p>\n<pre><code>\/\/time:50.004 \/\/ \/\/  T-0 &lt;-----------+   +-------+ generationId=1 \/\/  T-1 &lt;---------+ |   |Batcher| argList=[] \/\/  T-2 &lt;-------+ | |   +-------+ replyToList=[] \/\/              | | | \/\/              | | +---&quot;res#A&quot;--- +---------+ \/\/              | +---&quot;res#B&quot;----- |anonymous| \/\/              +--&quot;res#C&quot;-------- +---------+ <\/code><\/pre>\n<p>  \u0421\u043f\u0443\u0441\u0442\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u00ab\u0447\u0438\u0441\u0442\u043e\u0435\u00bb \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435  <\/p>\n<pre><code>\/\/time:50.005 \/\/ \/\/  T-0                 +-------+ generationId=1 \/\/  T-1                 |Batcher| argList=[] \/\/  T-2                 +-------+ replyToList=[] <\/code><\/pre>\n<p>  \u041f\u043e\u0437\u0436\u0435, \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, 75 \u043f\u043e\u0442\u043e\u043a T-2 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u00abD\u00bb  <\/p>\n<pre><code>\/\/time:75 \/\/ \/\/  T-0                 +-------+ generationId=1 \/\/  T-1                 |Batcher| argList=[] \/\/  T-2 ----&quot;D&quot;---&gt;     +-------+ replyToList=[] <\/code><\/pre>\n<p>  \u0421\u043f\u0443\u0441\u0442\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u0438\u0435 Batcher \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u043e\u0431\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u00abD\u00bb \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0443 T-2, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0442\u0430\u0439\u043c\u0435\u0440 \u0434\u043b\u044f \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f 1  <\/p>\n<pre><code>\/\/                                    +-----+ timeoutMsg=1 \/\/                                    |Timer| timeout=100 \/\/time:75.001                         +-----+ \/\/ \/\/  T-0                 +-------+ generationId=1 \/\/  T-1                 |Batcher| argList=[&quot;D&quot;] \/\/  T-2                 +-------+ replyToList=[T-2] <\/code><\/pre>\n<p>  \u0421\u043f\u0443\u0441\u0442\u044f 100\u043c\u0441 (\u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 175\u043c\u0441) \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 GPars \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u0435\u0442 \u0442\u0430\u0439\u043c\u0435\u0440 \u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f  <\/p>\n<pre><code>\/\/                                        +--&quot;TIMEOUT&quot;-- \/\/                                        | \/\/                                        v \/\/                                    +-----+ timeoutMsg=1 \/\/                                    |Timer| timeout=100 \/\/time:175                            +-----+ \/\/ \/\/  T-0                 +-------+ generationId=1 \/\/  T-1                 |Batcher| argList=[&quot;D&quot;] \/\/  T-2                 +-------+ replyToList=[T-2] <\/code><\/pre>\n<p>  \u0421\u043f\u0443\u0441\u0442\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u0442\u0430\u0439\u043c\u0435\u0440 \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u0435\u0442 Batcher \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f 1 \u0438\u0441\u0442\u0435\u043a\u043b\u043e  <\/p>\n<pre><code>\/\/                                     +-----+ timeoutMsg=1 \/\/                          +----1-----|Timer| timeout=100 \/\/time:175.001              |          +-----+ \/\/                          v \/\/  T-0                 +-------+ generationId=1 \/\/  T-1                 |Batcher| argList=[&quot;D&quot;] \/\/  T-2                 +-------+ replyToList=[T-2] <\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0439 \u0430\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0434 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 (\u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u0441\u0435\u0433\u043e 1 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442). \u041f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435 \u0441 1 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 2  <\/p>\n<pre><code>\/\/time:175.002 \/\/ \/\/  T-0                 +-------+ generationId=2 \/\/  T-1                 |Batcher| argList=[] \/\/  T-2                 +-------+ replyToList=[] \/\/ \/\/                                 +---------+ argList=[&quot;D&quot;] \/\/                                 |anonymous| replyToList=[T-2] \/\/                                 +---------+ <\/code><\/pre>\n<p>  \u0410\u043a\u0442\u043e\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b \u0440\u0430\u0431\u043e\u0442\u0443  <\/p>\n<pre><code>\/\/time:175.003 \/\/ \/\/  T-0                 +-------+ generationId=2 \/\/  T-1                 |Batcher| argList=[] \/\/  T-2                 +-------+ replyToList=[] \/\/ \/\/                                 +---------+ resultList=[&quot;res#D&quot;] \/\/                                 |anonymous| replyToList=[T-2] \/\/                                 +---------+ <\/code><\/pre>\n<p>  \u0410\u043a\u0442\u043e\u0440 \u0440\u0430\u0437\u0434\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b  <\/p>\n<pre><code>\/\/time:175.004 \/\/ \/\/  T-0                 +-------+ generationId=2 \/\/  T-1                 |Batcher| argList=[] \/\/  T-2 &lt;-------+       +-------+ replyToList=[] \/\/              | \/\/              |                  +---------+ \/\/              +--&quot;res#D&quot;----- |anonymous| \/\/                                 +---------+ <\/code><\/pre>\n<p>  \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u00ab\u0447\u0438\u0441\u0442\u043e\u043c\u00bb \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438   <\/p>\n<pre><code>\/\/time:175.005 \/\/ \/\/  T-0                 +-------+ generationId=2 \/\/  T-1                 |Batcher| argList=[] \/\/  T-2                 +-------+ replyToList=[] <\/code><\/pre>\n<h4>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438<\/h4>\n<p>  BatchProcessor \u2014 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u00ab\u0444\u0443\u043d\u043a\u0446\u0438\u0438\u00bb. \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0435\u0439 \u00ab\u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c\u00bb \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438  <\/p>\n<pre><code>import java.util.List;  public interface BatchProcessor&lt;ARG, RES&gt; {     List&lt;RES&gt; onBatch(List&lt;ARG&gt; argList) throws Exception; } <\/code><\/pre>\n<p>  Batcher \u2014 \u043a\u043b\u0430\u0441\u0441, \u00ab\u043f\u0430\u043a\u0443\u044e\u0449\u0438\u0439\u00bb \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b. \u042f\u0434\u0440\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f  <\/p>\n<pre><code>import groovyx.gpars.actor.*; import groovyx.gpars.actor.impl.MessageStream;  import java.util.*;  public class Batcher&lt;ARG, RES&gt; extends DynamicDispatchActor {     \/\/ fixed parameters     private final BatchProcessor&lt;ARG, RES&gt; processor;     private final int maxBatchSize;     private final long batchWaitTimeout;     \/\/ current state     private final List&lt;ARG&gt; argList = new ArrayList&lt;&gt;();     private final List&lt;MessageStream&gt; replyToList = new ArrayList&lt;&gt;();     private long generationId = 0;     private Actor lastTimer;      public Batcher(BatchProcessor&lt;ARG, RES&gt; processor, int maxBatchSize, long batchWaitTimeout) {         this.processor = processor;         this.maxBatchSize = maxBatchSize;         this.batchWaitTimeout = batchWaitTimeout;     }      public void onMessage(final ARG elem) {         argList.add(elem);         replyToList.add(getSender());         if (argList.size() == 1) {             lastTimer = new Timer&lt;&gt;(batchWaitTimeout, ++generationId, this).start();         } else if (argList.size() == maxBatchSize) {             lastTimer.send(&quot;KILL&quot;);             lastTimer = null;             nextGeneration();         }     }      public void onMessage(final long timeOutId) {         if (generationId == timeOutId) {nextGeneration();}     }      private void nextGeneration() {         new DynamicDispatchActor() {             public void onMessage(final Work&lt;ARG, RES&gt; work) throws Exception {                 List&lt;RES&gt; resultList = work.batcher.onBatch(work.argList);                 for (int k = 0; k &lt; resultList.size(); k++) {                     work.replyToList.get(k).send(resultList.get(k));                 }                 terminate();             }         }.start().send(new Work&lt;&gt;(processor, new ArrayList&lt;&gt;(argList), new ArrayList&lt;&gt;(replyToList)));         argList.clear();         replyToList.clear();         generationId = generationId + 1;     }      private static class Work&lt;ARG, RES&gt; {         public final BatchProcessor&lt;ARG, RES&gt; batcher;         public final List&lt;ARG&gt; argList;         public final List&lt;MessageStream&gt; replyToList;          public Work(BatchProcessor&lt;ARG, RES&gt; batcher, List&lt;ARG&gt; argList, List&lt;MessageStream&gt; replyToList) {             this.batcher = batcher;             this.argList = argList;             this.replyToList = replyToList;         }     } } <\/code><\/pre>\n<p>  BatcherDemo \u2014 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043b\u0430\u0441\u0441\u0430 Batcher. \u0421\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441\u043e \u0441\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u043c \u043f\u043b\u0430\u043d\u043e\u043c  <\/p>\n<pre><code>import groovyx.gpars.actor.Actor;  import java.io.IOException; import java.util.*; import java.util.concurrent.*; import static java.util.concurrent.Executors.newCachedThreadPool;  public class BatcherDemo {     public static final int BATCH_SIZE = 3;     public static final long BATCH_TIMEOUT = 100;          public static void main(String[] args) throws InterruptedException, IOException {         final Actor actor = new Batcher&lt;&gt;(new BatchProcessor&lt;String, String&gt;() {             public List&lt;String&gt; onBatch(List&lt;String&gt; argList) {                 System.out.println(&quot;onBatch(&quot; + argList + &quot;)&quot;);                 ArrayList&lt;String&gt; result = new ArrayList&lt;&gt;(argList.size());                 for (String arg : argList) {                     result.add(&quot;res#&quot; + arg);                 }                 return result;             }         }, BATCH_SIZE, BATCH_TIMEOUT).start();          ExecutorService exec = newCachedThreadPool();         exec.submit(new Callable&lt;Void&gt;() { \/\/ T-0             public Void call() throws Exception {                 System.out.println(actor.sendAndWait((&quot;A&quot;)));                 return null;             }         });         exec.submit(new Callable&lt;Void&gt;() { \/\/ T-1             public Void call() throws Exception {                 Thread.sleep(25);                 System.out.println(actor.sendAndWait((&quot;B&quot;)));                 return null;             }         });         exec.submit(new Callable&lt;Void&gt;() { \/\/ T-2             public Void call() throws Exception {                 Thread.sleep(50);                 System.out.println(actor.sendAndWait((&quot;C&quot;)));                 Thread.sleep(25);                 System.out.println(actor.sendAndWait((&quot;D&quot;)));                 return null;             }         });                  exec.shutdown();     } } &gt;&gt; onBatch([A, B, C]) &gt;&gt; res#A &gt;&gt; res#B &gt;&gt; res#C &gt;&gt; onBatch([D]) &gt;&gt; res#D <\/code><\/pre>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u0412 \u043c\u043e\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438, \u0430\u043a\u0442\u043e\u0440\u044b \u0445\u043e\u0440\u043e\u0448\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u0441\u043e\u0431\u043e\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u044b \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043a\u0440\u043e\u043c\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0447\u0435\u0433\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0438\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>  \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044f\u043c\u0438 \u043a\u043e\u0434\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u0441\u0435\u0442\u0438 \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044f <a href=\"http:\/\/gpars.org\/guide\/index.html\">gpars.org\/guide<\/a>.<\/p>\n<p>  \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b  <\/p>\n<ul>\n<li>\u0418\u0437\u043c\u0435\u0440\u0438\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/li>\n<li>\u0423\u0441\u043a\u043e\u0440\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 JDBC \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0432 \u043e\u0434\u043d\u0443 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e RDBMS. \u0422\u043e \u0435\u0441\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0435\u043c batch \u043d\u0435 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e Connection, \u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 Connection-\u0430\u043c\u0438.<\/li>\n<\/ul>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/217899\/\"> http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/217899\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t\u041a\u0440\u0430\u0442\u043a\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f API \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"http:\/\/gpars.codehaus.org\/\">GPars<\/a> \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0432 \u00ab\u043d\u0430\u0440\u043e\u0434\u043d\u043e\u043c \u0445\u043e\u0437\u044f\u0439\u0441\u0442\u0432\u0435\u00bb.<\/p>\n<p>  \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0445\u043e\u0434\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0430\u043a\u0442\u043e\u0440\u043e\u0432, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 Java-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0443, \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043a \u0447\u0442\u0435\u043d\u0438\u044e \u043a\u0443\u0440\u0441\u0430 <a href=\"http:\/\/habrahabr.ru\/company\/golovachcourses\/blog\/217051\/\">\u00abMulticore programming in Java\u00bb<\/a>.<\/p>\n<p>  \u042d\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u0441\u0442\u0430\u0442\u0435\u0439 \u0446\u0435\u043b\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c API, \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0430\u043a\u0442\u043e\u0440\u043e\u0432 Akka \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445 \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435. \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0442\u0430\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 GPars. <\/p>\n<p>  GPars \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0434\u043b\u044f Clojure \u0441 \u0448\u0438\u0440\u043e\u043a\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u043c.<br \/>  \u041f\u043b\u044e\u0441\u044b GPars  <\/p>\n<ul>\n<li>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Java (\u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 Akka, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 Scala). \u0412\u0441\u0435\u0433\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u00ab\u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u00bb \u043d\u0430 \u00ab\u0440\u043e\u0434\u043d\u043e\u043c\u00bb \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/li>\n<li>GPars \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0446\u0435\u043b\u044b\u0439 \u00ab\u0437\u043e\u043e\u043f\u0430\u0440\u043a\u00bb \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 (Actor, Agent, STM, CSP, Dataflow)<\/li>\n<li>GPars \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u0437 runtime-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Clojure, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 Java. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f<\/li>\n<\/ul>\n<p>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-217899","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/217899","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=217899"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/217899\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=217899"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=217899"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=217899"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}