{"id":10330,"date":"2020-10-02T11:39:00","date_gmt":"2020-10-02T02:39:00","guid":{"rendered":"http:\/\/www.gisdeveloper.co.kr\/?p=10330"},"modified":"2020-10-05T07:10:34","modified_gmt":"2020-10-04T22:10:34","slug":"worker-thread-%ed%8c%a8%ed%84%b4","status":"publish","type":"post","link":"http:\/\/www.gisdeveloper.co.kr\/?p=10330","title":{"rendered":"Worker Thread \ud328\ud134"},"content":{"rendered":"<h4>\ud328\ud134 \uba85\uce6d<\/h4>\n<p>Worker Thread<\/p>\n<h4>\ud544\uc694\ud55c \uc0c1\ud669<\/h4>\n<p>\uc5b4\ub5a4 \ub370\uc774\ud130\uac00 \uc0dd\uc131\ub418\uba74, \uc774 \ub370\uc774\ud130\ub97c \ub610 \ub2e4\ub978 \uc5ec\ub7ec \uac1c\uc758 \uc2a4\ub808\ub4dc\uc5d0\uc11c \ucc98\ub9ac\ud55c\ub2e4. \ubb3c\ub860 \ub370\uc774\ud130\uc758 \uc0dd\uc131 \uc5ed\uc2dc \ub610 \ub2e4\ub978 \uc5ec\ub7ec \uac1c\uc758 \uc2a4\ub808\ub4dc\uc5d0\uc11c \ucc98\ub9ac\ud55c\ub2e4. \ub370\uc774\ud130\uc758 \ucc98\ub9ac\ub97c \ub3d9\uc2dc\uc5d0 \ucc98\ub9ac\ud558\uba74\uc11c \ucc98\ub9ac\ud558\ub294 \ubc29\uc2dd\uc740 \ud55c\uac00\uc9c0\ub85c \uc815\ud574\uc9c4 \uac83\uc774 \uc544\ub2cc \ub2e4\uc591\ud55c \ubc29\uc2dd\uc73c\ub85c \uc218\ud589\ub418\uba70, \uac04\ub2e8\uc774 \ucd94\uac00\ub420 \uc218 \uc788\uc5b4\uc57c \ud55c\ub2e4. \uc774\ub54c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ud328\ud134\uc774\ub2e4. \uc0ac\uc2e4, \ub370\uc774\ud130\uc758 \ub2e4\uc591\ud55c \ubc29\uc2dd\uc758 \ucc98\ub9ac\ub294 Worker Thread\uc758 \uc751\uc6a9\uc774\ub2e4.<\/p>\n<h4>\uc608\uc81c \ucf54\ub4dc<\/h4>\n<p><img decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2020\/10\/workerthread.png\" alt=\"\" width=\"800\" class=\"aligncenter size-full wp-image-10331\" \/><\/p>\n<p>Client \ud074\ub798\uc2a4\ub294 \ucc98\ub9ac\ud560 \ub370\uc774\ud130\ub97c \uc0dd\uc131\ud55c\ub2e4. \uc774\ub807\uac8c \uc0dd\uc131\ub41c \ub370\uc774\ud130\ub294 Request\ub77c\ub294 \ud074\ub798\uc2a4\uc5d0 \ub2f4\uae30\uac8c \ub418\ub294\ub370 \uc774 Request\ub294 \ucd94\uc0c1 \ud074\ub798\uc2a4\uc774\uba70, \uc774 \ud074\ub798\uc2a4\ub97c \uc0c1\uc18d\ubc1b\uc544 \ub370\uc774\ud130\uc5d0 \ub300\ud55c \ucc98\ub9ac \ubc29\uc2dd\uc744 \uc815\uc758\ud560 \uc218 \uc788\ub2e4. Client\uac00 \uc0dd\uc131\ud55c Request\ub294 \ubc14\ub85c \ucc98\ub9ac\ub418\ub294\uac8c \uc544\ub2c8\uace0 Channel \ud074\ub798\uc2a4\uc5d0 \uc800\uc7a5\ub41c\ub2e4. \uc774\ub807\uac8c \uc800\uc7a5\ub41c \ub370\uc774\ud130\uc5d0 \ub300\ud55c Request\ub294 Worker \ud074\ub798\uc2a4\uc5d0\uc758\ud574 \uc2a4\ub808\ub4dc\ub85c \ucc98\ub9ac\ub41c\ub2e4. \uc774 Worker \ud074\ub798\uc2a4\ub294 WorkerPool\uc774\ub77c\ub294 \uc2a4\ub808\ub4dc \uc800\uc7a5\uc18c\uc5d0 \ubbf8\ub9ac \uc0dd\uc131\ub418\uc5b4 \uad00\ub9ac\ub41c\ub2e4. \uc774\ub7ec\ud55c \ud074\ub798\uc2a4\ub4e4\uc744 \uc0ac\uc6a9\ud558\ub294 \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class Main {\r\n\tpublic static void main(String[] args) {\r\n\t\tChannel channel = new Channel(10);\r\n\t\tWorkerPool workers = new WorkerPool(5, channel);\r\n\t\tworkers.start();\r\n\t\t\r\n\t\tnew Client(\"ClientA\", channel).start();\r\n\t\tnew Client(\"ClientB\", channel).start();\r\n\t\tnew Client(\"ClientC\", channel).start();\r\n\t}\r\n}\r\n<\/pre>\n<p>Channel\uc5d0 \ucd5c\ub300\ub85c \uc800\uc7a5\ud560 \uc218 \uc788\ub294 Request\uc758 \uac1c\uc218\ub294 10\uac1c, \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\ub294 Worker\uc758 \uac1c\uc218\ub294 5\uac1c\ub85c \uc815\ud588\uc73c\uba70, \ub370\uc774\ud130\ub97c \uc0dd\uc131\ud558\ub294 Client \uc2a4\ub808\ub4dc\uc758 \uac1c\uc218\ub294 3\uac1c\uc774\ub2e4. Client \ud074\ub798\uc2a4\uc758 \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\nimport java.util.Random;\r\n\r\npublic class Client extends Thread {\r\n\tprivate final Channel channel;\r\n\tprivate static final Random random = new Random();\r\n\t\r\n\tpublic Client(String name, Channel channel) {\r\n\t\tsuper(name);\r\n\t\tthis.channel = channel;\r\n\t}\r\n\t\r\n\tpublic void run() {\r\n\t\ttry {\r\n\t\t\tfor(int i = 0; true; i++) {\r\n\t\t\t\tRequest request;\r\n\r\n\t\t\t\tThread.sleep(random.nextInt(1000));\r\n\t\t\t\tif(random.nextInt(2) == 0) { \r\n\t\t\t\t\trequest = new OneRequest(getName(), i);\r\n\t\t\t\t} else {\r\n\t\t\t\t\trequest = new TwoRequest(getName(), i);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tchannel.putRequest(request);\r\n\t\t\t}\r\n\t\t} catch(InterruptedException e) {\r\n\t\t\t\/\/.\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>\ucc98\ub9ac\ud574\uc57c\ud560 \ub370\uc774\ud130\ub294 \uc815\uc218\uac12\uc774\uba70, \uc774 \uc815\uc218\uac12\uc758 \ub370\uc774\ud130\uc5d0 \ub300\ud55c \ucc98\ub9ac\ub294 \ubb34\uc791\uc704\ub85c \uacb0\uc815\ub418\ub294\ub370, \uc2e4\uc81c \ucc98\ub9ac\uc5d0 \ub300\ud55c \ucf54\ub4dc\ub294 OneRequest\uc640 TwoRequest \ud074\ub798\uc2a4\uc5d0 \uc815\uc758\ub418\uc5b4 \uc788\ub2e4. Request \ucd94\uc0c1 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic abstract class Request {\r\n\tprotected final String clentName;\r\n\tprotected final int number;\r\n\t\r\n\tpublic Request(String clentName, int number) {\r\n\t\tthis.clentName = clentName;\r\n\t\tthis.number = number;\r\n\t}\r\n\t\r\n\tpublic abstract void execute();\r\n}\r\n<\/pre>\n<p>\uc774 \ucd94\uc0c1\ud074\ub798\uc2a4\ub97c \uad6c\ud604\ud558\ub294 OneRequest \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class OneRequest extends Request {\r\n\r\n\tpublic OneRequest(String name, int number) {\r\n\t\tsuper(name, number);\r\n\t}\r\n\r\n\tpublic void execute() {\r\n\t\tString result = \"ECHO: \" + number + \"@\" + clentName;\r\n\t\tSystem.out.println(Thread.currentThread().getName() + \" -> \" + result);\r\n\t}\r\n}\r\n<\/pre>\n<p>\ub610 \ub2e4\ub978 \ucc98\ub9ac \ubc29\uc2dd\uc778 TwoRequest \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class TwoRequest extends Request {\r\n\r\n\tpublic TwoRequest(String name, int number) {\r\n\t\tsuper(name, number);\r\n\t}\r\n\r\n\tpublic void execute() {\r\n\t\tString result = \"POWER: \" + (number*number) + \"@\" + clentName;\r\n\t\tSystem.out.println(Thread.currentThread().getName() + \" -> \" + result);\r\n\t}\r\n}\r\n<\/pre>\n<p>\uc774 Request \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uac1d\uccb4\ub294 Client\uac00 \uc0dd\uc131\ud558\uc5ec Channel\uc5d0 \uc800\uc7a5\ub418\ub294\ub370, Channel \ud074\ub798\uc2a4\uc758 \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\nimport java.util.LinkedList;\r\n\r\npublic class Channel {\r\n\tprivate final int maxCountRequests;\r\n\tprivate final LinkedList&lt;Request> requestQueue = new LinkedList&lt;Request>();\r\n\t\r\n\tpublic Channel(int maxCountRequests) {\r\n\t\tthis.maxCountRequests = maxCountRequests;\r\n\t}\r\n\t\r\n\tpublic synchronized void putRequest(Request request) {\r\n\t\twhile(requestQueue.size() >= maxCountRequests) {\r\n\t\t\ttry {\r\n\t\t\t\twait();\r\n\t\t\t} catch(InterruptedException e) {\r\n\t\t\t\t\/\/.\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\trequestQueue.addLast(request);\r\n\t\tnotifyAll();\r\n\t}\r\n\t\r\n\tpublic synchronized Request takeRequest() {\r\n\t\twhile(requestQueue.size() <= 0) {\r\n\t\t\ttry {\r\n\t\t\t\twait();\r\n\t\t\t} catch(InterruptedException e) {\r\n\t\t\t\t\/\/.\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tRequest request = requestQueue.pollFirst();\r\n\t\tnotifyAll();\r\n\r\n\t\treturn request;\r\n\t}\r\n}\r\n<\/pre>\n<p>\ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\ub294 Worker \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class Worker extends Thread {\r\n\tprivate final Channel channel;\r\n\t\r\n\tpublic Worker(String name, Channel channel) {\r\n\t\tsuper(name);\r\n\t\tthis.channel = channel;\r\n\t}\r\n\t\r\n\tpublic void run() {\r\n\t\twhile(true) {\r\n\t\t\tRequest request = channel.takeRequest();\r\n\t\t\trequest.execute();\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>Worker \ud074\ub798\uc2a4\uc758 \uac1d\uccb4\ub294 WorkerPool\uc774\ub77c\ub294 \ud074\ub798\uc2a4\ub97c \ud1b5\ud574 \uc0dd\uc131\ub418\uc5b4 \uad00\ub9ac\ub418\uba70 \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class WorkerPool {\r\n\tprivate final Worker[] threadPool;\r\n\t\r\n\tpublic WorkerPool(int countThreads, Channel channel) {\r\n\t\tthreadPool = new Worker[countThreads];\r\n\t\tfor(int i=0; i&lt;threadPool.length; i++) {\r\n\t\t\tthreadPool[i] = new Worker(\"Worker-\" + i, channel);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void start() {\r\n\t\tfor(int i=0; i&lt;threadPool.length; i++) {\r\n\t\t\tthreadPool[i].start();\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>\uc2e4\ud589 \uacb0\uacfc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class='code'>\r\nWorker-0 -> ECHO: 0@ClientA\r\nWorker-4 -> ECHO: 0@ClientB\r\nWorker-3 -> POWER: 0@ClientC\r\nWorker-2 -> POWER: 1@ClientB\r\nWorker-3 -> POWER: 4@ClientB\r\nWorker-2 -> POWER: 1@ClientC\r\n\r\n.\r\n.\r\n.\r\n\r\norker-0 -> POWER: 625@ClientC\r\nWorker-2 -> POWER: 784@ClientB\r\nWorker-0 -> POWER: 841@ClientB\r\nWorker-2 -> POWER: 784@ClientA\r\nWorker-0 -> POWER: 841@ClientA\r\nWorker-2 -> ECHO: 30@ClientB\r\nWorker-0 -> POWER: 676@ClientC\r\nWorker-2 -> ECHO: 30@ClientA\r\nWorker-3 -> POWER: 961@ClientA\r\nWorker-2 -> ECHO: 32@ClientA\r\nWorker-3 -> POWER: 961@ClientB\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\ud328\ud134 \uba85\uce6d Worker Thread \ud544\uc694\ud55c \uc0c1\ud669 \uc5b4\ub5a4 \ub370\uc774\ud130\uac00 \uc0dd\uc131\ub418\uba74, \uc774 \ub370\uc774\ud130\ub97c \ub610 \ub2e4\ub978 \uc5ec\ub7ec \uac1c\uc758 \uc2a4\ub808\ub4dc\uc5d0\uc11c \ucc98\ub9ac\ud55c\ub2e4. \ubb3c\ub860 \ub370\uc774\ud130\uc758 \uc0dd\uc131 \uc5ed\uc2dc \ub610 \ub2e4\ub978 \uc5ec\ub7ec \uac1c\uc758 \uc2a4\ub808\ub4dc\uc5d0\uc11c \ucc98\ub9ac\ud55c\ub2e4. \ub370\uc774\ud130\uc758 \ucc98\ub9ac\ub97c \ub3d9\uc2dc\uc5d0 \ucc98\ub9ac\ud558\uba74\uc11c \ucc98\ub9ac\ud558\ub294 \ubc29\uc2dd\uc740 \ud55c\uac00\uc9c0\ub85c \uc815\ud574\uc9c4 \uac83\uc774 \uc544\ub2cc \ub2e4\uc591\ud55c \ubc29\uc2dd\uc73c\ub85c \uc218\ud589\ub418\uba70, \uac04\ub2e8\uc774 \ucd94\uac00\ub420 \uc218 \uc788\uc5b4\uc57c \ud55c\ub2e4. \uc774\ub54c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ud328\ud134\uc774\ub2e4. \uc0ac\uc2e4, \ub370\uc774\ud130\uc758 \ub2e4\uc591\ud55c \ubc29\uc2dd\uc758 \ucc98\ub9ac\ub294 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/?p=10330\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Worker Thread \ud328\ud134&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-10330","post","type-post","status-publish","format-standard","hentry","category-design"],"_links":{"self":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10330","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10330"}],"version-history":[{"count":6,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10330\/revisions"}],"predecessor-version":[{"id":10337,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10330\/revisions\/10337"}],"wp:attachment":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10330"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10330"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10330"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}