{"id":766,"date":"2018-11-28T04:25:55","date_gmt":"2018-11-28T01:25:55","guid":{"rendered":"http:\/\/delimuhendis.org\/?p=766"},"modified":"2022-12-20T21:11:02","modified_gmt":"2022-12-20T21:11:02","slug":"multithreading-2","status":"publish","type":"post","link":"https:\/\/www.delimuhendis.org\/?p=766","title":{"rendered":"Java ile Multithreading \u0130\u015flemleri-2 (Fork-Join)"},"content":{"rendered":"\n<p>Merhaba arkada\u015flar, bug\u00fcn sizinle fork join i\u015flemleri \u00fczerinde duraca\u011f\u0131z. Ge\u00e7ti\u011fimiz derste geleneksel threading y\u00f6ntemiyle gitmi\u015ftik. Peki ya \u00e7ok b\u00fcy\u00fck veriler \u00fczerinde \u00e7al\u0131\u015f\u0131yorsak. \u015eimdi sizinle 1&#8217;den 10 milyon&#8217;a kadar olan say\u0131lar\u0131n toplam\u0131n\u0131 alan bir program yazal\u0131m bunu yaparken de Fork Join yakla\u015f\u0131m\u0131n\u0131 kullanaca\u011f\u0131z.<\/p>\n\n\n\n<p>\u00d6ncelikle fork join yakla\u015f\u0131m\u0131 hakk\u0131nda biraz bilgi vereyim. Fork Join bir i\u015f y\u00fck\u00fcn\u00fc hiyerar\u015fik olarak alt g\u00f6revlere b\u00f6len bir yakla\u015f\u0131md\u0131r. \u00d6rne\u011fin 1000 elemanl\u0131 bir dizimiz olsun ve her bir fork join nesnesi en fazla 50 eleman\u0131n sorumlulu\u011funu i\u015fleme alabilsin. \u0130lk 1000 elemanl\u0131 dizi ikiye b\u00f6l\u00fcnm\u00fc\u015f halde sa\u011f ve sol join olmak \u00fczere 2 alt nesneye 500&#8217;er eleman olarak verilir. Onlar da say\u0131n\u0131n limitin \u00fcst\u00fcnde oldu\u011fundan dolay\u0131 2&#8217;ye b\u00f6ler ve 250 elemanl\u0131 yeni sorumluluklar alt elemanlara bildirilir.Bu i\u015flem sorumlu olunan say\u0131lar, limitin alt\u0131nda kal\u0131ncaya kadar devam eder ve sonunda hiyerar\u015fide altta kalan t\u00fcm nesneler hesaplama sonu\u00e7lar\u0131n\u0131 \u00fcste bildirir.Daha iyi anla\u015f\u0131labilmesi i\u00e7in a\u015fa\u011f\u0131daki g\u00f6rseli payla\u015f\u0131yorum.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignleft\"><a href=\"http:\/\/delimuhendis.org\/wp-content\/uploads\/2018\/11\/fork-join-framework.png\"><img decoding=\"async\" src=\"http:\/\/delimuhendis.org\/wp-content\/uploads\/2018\/11\/fork-join-framework.png\" alt=\"\" class=\"wp-image-767\"\/><\/a><\/figure>\n<\/div>\n\n\n<p>Fork join geli\u015ftirmesi yaparken kulland\u0131\u011f\u0131m\u0131z 2 temel s\u0131n\u0131f vard\u0131r. Bunlar, RecursiveTask ve RecursiveAction. RecursiveTask de\u011fer d\u00f6nd\u00fcr\u00fcr ama RecursiveAction d\u00f6nd\u00fcrmez.<\/p>\n\n\n\n<p>\u00d6ncelikle Fork Join S\u0131n\u0131f\u0131m\u0131z\u0131 a\u015fa\u011f\u0131daki gibi olu\u015ftural\u0131m. Ba\u015fta s\u00f6yledi\u011fimiz gibi RecursiveTask&#8217;lar de\u011fer d\u00f6nd\u00fcr\u00fcr ve bizim Long tipinde bir de\u011ferimiz olaca\u011f\u0131 i\u00e7in gerek s\u0131n\u0131f\u0131 deklere ederken gerekse Compute methodunu kullan\u0131rken bunu belirtmemiz gerekir.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">class Sum extends RecursiveTask&lt;Long&gt;\n{\n    static final int BlockSize = 5000;\n    int start, end;\n    int[] data;\n\n    Sum(int[] data, int start, int end)\n    {\n        this.data = data;\n        this.start = start;\n        this.end = end;\n    }\n\n    protected Long compute()\n    {\n        \/* \n            Sorumluluk limitten k\u00fc\u00e7\u00fckse direk hesapla yoksa alt g\u00f6revlere da\u011f\u0131t ve \n            bunu recursive olarak yinele\n       *\/\n        if (end - start &lt;= BlockSize)\n        {\n            long sum = 0;\n            for (int i = start; i &lt; end; ++i)\n            {\n                sum = sum + data[i];\n            }\n            return sum;\n        }\n        else\n        {\n            \/\/ Sorumlulu\u011fu b\u00f6l ve alt g\u00f6revler olu\u015fturarak onlara payla\u015ft\u0131r.\n            int mid = start + (end - start) \/ 2;\n            Sum left = new Sum(data, start, mid);\n            Sum right = new Sum(data, mid, end);\n            left.fork();\n            right.fork();\n            long rightSum = right.join();\n            long leftSum = left.join();\n            return leftSum + rightSum;\n        }\n    }\n}<\/pre>\n\n\n\n<p>Main thread i\u00e7erisinde diziyi olu\u015ftur. Diziyi,sorumluluk ba\u015flang\u0131\u00e7 noktas\u0131 olarak 0&#8217;\u0131 ve biti\u015f noktas\u0131 olarak dizinin uzunlu\u011funu parametre olarak fork join nesnesine ver.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.*;\n\npublic class Main\n{\n\n    public static void main( String[] args ) throws Exception\n    {\n        int numbers[] = new int[10000000];\n\n        for(int i = 0; i &lt; numbers.length; i++)\n        {\n            numbers[i] = i;\n        }\n\n        ForkJoinPool fjPool = new ForkJoinPool();\n        long sum = fjPool.invoke(new Sum(numbers,0,numbers.length));\n        System.out.println(\"Sum of numbers in the array = \"+sum);\n    }\n\n}<\/pre>\n\n\n\n<p>Sonu\u00e7<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Sum of numbers in the array = 49999995000000<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba arkada\u015flar, bug\u00fcn sizinle fork join i\u015flemleri \u00fczerinde duraca\u011f\u0131z. Ge\u00e7ti\u011fimiz derste geleneksel threading y\u00f6ntemiyle gitmi\u015ftik. Peki ya \u00e7ok b\u00fcy\u00fck veriler&hellip;<\/p>\n","protected":false},"author":1,"featured_media":1390,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[19,218,302,307,395,469,551,558],"class_list":["post-766","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programlama","tag-action","tag-fork","tag-java","tag-join","tag-multithreading","tag-recursive","tag-task","tag-thread"],"_links":{"self":[{"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/posts\/766","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=766"}],"version-history":[{"count":1,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/posts\/766\/revisions"}],"predecessor-version":[{"id":1356,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/posts\/766\/revisions\/1356"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/media\/1390"}],"wp:attachment":[{"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=766"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=766"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=766"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}