ExecutorService ใน Java คืออะไรและจะสร้างได้อย่างไร



บทความนี้ครอบคลุมแนวคิดของ Executor sub-interface ExecutorService ใน Java พร้อมตัวอย่างต่างๆเพื่ออธิบายการสร้างและจัดการเธรดใน Java

ภาษาการเขียนโปรแกรม Java ทำงานได้อย่างมีประสิทธิภาพมากกับ แอปพลิเคชั่นที่ต้องการให้งานดำเนินการพร้อมกันในเธรด เป็นเรื่องยากสำหรับแอปพลิเคชันใด ๆ ที่จะรันเธรดจำนวนมากพร้อมกัน เพื่อเอาชนะปัญหานี้ มาพร้อมกับ ExecutorService ซึ่งเป็นอินเทอร์เฟซย่อยของ . ในบทความนี้เราจะพูดถึงการทำงานของ ExecutorService ใน Java ต่อไปนี้เป็นหัวข้อที่กล่าวถึงในบล็อกนี้:

Executor Framework คืออะไร?

มันค่อนข้างง่ายกว่าที่จะสร้างและดำเนินการหนึ่งหรือสองเธรดพร้อมกัน แต่จะกลายเป็นเรื่องยากเมื่อจำนวนเธรดเพิ่มขึ้นเป็นจำนวนที่มีนัยสำคัญ แอพพลิเคชั่นแบบมัลติเธรดขนาดใหญ่จะมีเธรดหลายร้อยเธรดที่ทำงานพร้อมกัน ดังนั้นจึงเหมาะสมอย่างยิ่งที่จะแยกการสร้างเธรดออกจากการจัดการเธรดในแอปพลิเคชัน





ตัวดำเนินการคือ ช่วยคุณในการสร้างและจัดการเธรดในแอปพลิเคชัน ช่วยคุณในงานต่อไปนี้

  • การสร้างเธรด: มีวิธีการมากมายสำหรับการสร้างเธรดที่ช่วยในการรันแอปพลิเคชันของคุณพร้อมกัน



  • การจัดการเธรด: นอกจากนี้ยังจัดการวงจรชีวิตของเธรด คุณไม่จำเป็นต้องกังวลว่าเธรดจะทำงานไม่ว่างหรือตายก่อนที่จะส่งงานเพื่อดำเนินการ

  • การส่งงานและการดำเนินการ: เฟรมเวิร์กผู้ดำเนินการจัดเตรียมวิธีการสำหรับการส่งงานในเธรดพูลนอกจากนี้ยังให้อำนาจในการตัดสินใจว่าเธรดจะถูกดำเนินการหรือไม่

executeorservice-executorservice ใน java -edureka

ExecutorService ในตัวอย่าง Java

เป็นอินเทอร์เฟซย่อยของเฟรมเวิร์กตัวดำเนินการที่เพิ่มฟังก์ชันบางอย่างเพื่อจัดการวงจรชีวิตเธรดของแอปพลิเคชัน นอกจากนี้ยังมีวิธี submit () ซึ่งสามารถยอมรับได้ทั้งแบบรันได้และเรียกใช้ได้ วัตถุ



ในตัวอย่างต่อไปนี้เราจะสร้าง ExecutorService ด้วยเธรดเดียวจากนั้นส่งงานที่จะดำเนินการภายในเธรด

import java.util.concurrent.ExecutorService import java.util.concurrent.Executors public class ตัวอย่าง {public static void main (String [] args) {System.out.println ('Inside:' + Thread.currentThread (). getName ( )) System.out.println ('การสร้าง ExecutorService') ExecutorService executorservice = Executors.newSingleThreadExecutor () System.out.println ('การสร้าง runnable') Runnable runnable = () -> {System.out.println ('inside: '+ Thread.currentThread (). getName ())} System.out.println (' ส่งงานที่ระบุโดย runnable ไปยัง executorservice ') executorservice.submit (runnable)}}
 เอาท์พุต: ภายใน: การสร้างหลัก ExecutorService การสร้าง runnable ส่งงานที่ระบุโดย runnable ไปยัง executorservice ภายใน: pool-1-thread-1

ข้างบน แสดงให้เห็นว่าเราสามารถสร้าง ExecutorService และดำเนินการงานภายในตัวดำเนินการได้อย่างไร หากงานถูกส่งไปเพื่อดำเนินการและเธรดกำลังยุ่งอยู่ในการรันงานอื่นงานนั้นจะรอคิวจนกว่าเธรดจะว่างที่จะดำเนินการ

เมื่อคุณเรียกใช้โปรแกรมข้างต้นโปรแกรมจะไม่ออก คุณจะต้องปิดมันอย่างชัดเจนเนื่องจากบริการเรียกใช้งานยังคงรับฟังงานใหม่ ๆ

การใช้งาน Java ExecutorService

ExecutorService คล้ายกับเธรดพูลมาก ในความเป็นจริงการนำ ExecutorService ไปใช้ใน java.util.concurrent แพ็คเกจ คือการใช้งานเธรดพูล ExecutorService มีการนำไปใช้งานต่อไปนี้ในแพ็คเกจ java.util.concurrent:

ThreadPoolExecutor

ThreadPoolExecutor ดำเนินการงานที่กำหนดโดยใช้หนึ่งในเธรดที่รวมไว้ภายใน

การสร้าง threadPoolExecutor

int corePoolSize = 5 int maxPoolSize = 10 long keepAliveTime = 5000 ExecutorService threadPoolExecutor = threadPoolExecutor ใหม่ (corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, LinkedBlockingQueue ใหม่ ())

ScheduledThreadPoolExecutor

java.util.concurrent.ScheduledThreadPoolExecutor คือ ExecutorService ที่สามารถกำหนดเวลาให้งานรันหลังจากการหน่วงเวลาหรือเพื่อดำเนินการซ้ำ ๆ โดยมีช่วงเวลาคงที่ระหว่างการดำเนินการแต่ละครั้ง

ตัวอย่าง

ScheduledExecutorService ScheduledExecutorservice = Executors.newScheduledThreadPool (5) ScheduledFuture Scheduledfuture = ScheduledExecutorService.schedule (new Callable () {public Object call () พ่น Exception {System.out.println ('executed') return 'เรียกว่า'}}, 5, TimeUnit วินาที)

การใช้งาน ExecutorService

มีหลายวิธีในการมอบหมายงานให้กับ ExecutorService

  • ดำเนินการ (Runnable)

  • ส่ง (รันได้)

  • invokeAny ()

  • เรียกใช้ทั้งหมด ()

เรียกใช้ Runnable

Java ExecutorService execute (Runnable) ใช้อ็อบเจ็กต์ java.lang.Runnable และรันแบบอะซิงโครนัส

ExecutorService executorService = Executors.newSingleThreadExecutor () executorService.execute (Runnable ใหม่ () {โมฆะสาธารณะ run () {System.out.println ('asynchronous task')}}) executorService.shutdown ()

ไม่มีวิธีใดที่จะได้รับผลลัพธ์ของการรัน Runnable เพราะคุณต้องใช้ Callable

ส่ง Runnable

เมธอด Java ExecutorService submit (Runnable) ใช้การรันรันได้และส่งคืนอ็อบเจ็กต์ในอนาคต สามารถใช้อ็อบเจ็กต์ในอนาคตเพื่อตรวจสอบว่า Runnable ทำงานเสร็จหรือไม่

อนาคตในอนาคต = executorService.submit (Runnable ใหม่ () {public void run () {System.out.println (: asynchronous task ')}}) future.get () // ส่งคืนค่า null หากงานเสร็จสิ้นอย่างถูกต้อง

ส่งโทรได้

เมธอด Java ExecutorService submit (Callable) คล้ายกับ submit (Runnable) แต่ใช้ Java Callable แทน Runnable

อนาคตในอนาคต = executorService.submit (ใหม่ Callable () {public Object call () พ่น Exception {System.out.println ('Asynchronous callable') return 'Callable Result'}}) System.out.println ('future.get ( ) = 'future.get ())
 เอาท์พุต: ไม่สามารถเรียกได้ future.get = ผลลัพธ์ที่เรียกได้

invokeAny ()

วิธีการ invokeAny () รับคอลเลกชันของวัตถุที่เรียกได้ การเรียกใช้วิธีนี้จะไม่ส่งคืนอนาคตใด ๆ แต่ส่งกลับผลลัพธ์ของวัตถุที่เรียกได้

ExecutorService executorService = Executors.newSingleThreadExecutor () ชุดcallables = HashSet ใหม่() callables.add (new Callable () {public String call () พ่น Exception {return'task A '}}) callables.add (new Callable () {public String call () พ่นข้อยกเว้น {return'task B'} }) callables.add (new Callable () {public String call () พ่น Exception {return'task C '}}) ผลลัพธ์ String = executorService.invokeAny (callables) System.out.println (' result = '+ result) executorService .ปิดตัวลง()

เมื่อคุณรันโค้ดด้านบนผลลัพธ์จะเปลี่ยนไป อาจเป็นงาน A งาน B และอื่น ๆ

เรียกใช้ทั้งหมด ()

วิธีการ invokeAll () เรียกใช้อ็อบเจ็กต์ที่เรียกได้ทั้งหมดที่ส่งผ่านเป็นพารามิเตอร์ ส่งคืนวัตถุในอนาคตซึ่งสามารถใช้เพื่อรับผลลัพธ์ของการดำเนินการของ Callable แต่ละรายการ

ExecutorService executorService = Executors.newSingleThreadExecutor () ชุดcallables = HashSet ใหม่() callables.add (new Callable () {public String call () พ่น Exception {return 'Task A'}}) callables.add (new Callable () {public String call () พ่น Exception {return 'Task B'} }) callables.add (new Callable () {public String call () พ่นรายการ Exception {return 'Task C'}})futures = executorService.invokeAll (callables) สำหรับ (อนาคตในอนาคต: ฟิวเจอร์ส) {System.out.println ('future.get =' + future.get ())} executorService.shutdown ()

Runnable vs Callable

อินเทอร์เฟซที่รันได้และที่เรียกได้นั้นคล้ายกันมาก ความแตกต่างสามารถมองเห็นได้ในการประกาศของ อินเทอร์เฟซ อินเทอร์เฟซทั้งสองแสดงถึงงานที่สามารถดำเนินการพร้อมกันโดยเธรดหรือ ExecutorService

คำประกาศที่เรียกได้:

อินเทอร์เฟซสาธารณะที่เรียกได้ {public object call () throws Exception}

Runnable Declaration:

อินเทอร์เฟซสาธารณะ Runnable {public void run ()}

ความแตกต่างหลักระหว่างทั้งสองคือเมธอด call () สามารถส่งคืนอ็อบเจ็กต์จากการเรียกใช้เมธอด และวิธีการโทร () สามารถโยนไฟล์ ในขณะที่ run () วิธีการไม่สามารถ

วิธีค้นหา palindrome ใน java

ยกเลิกงาน

คุณสามารถยกเลิกงานที่ส่งไปยัง ExecutorService ได้โดยเพียงแค่เรียกใช้เมธอดการยกเลิกในอนาคตที่ส่งมาเมื่อมีการส่งงาน

Future.cancel ()

การปิดระบบ ExecutorService

เพื่อป้องกันไม่ให้เธรดทำงานแม้หลังจากการดำเนินการเสร็จสิ้นคุณควรปิด ExecutorService

ปิดตัวลง()

ในการยุติเธรดภายใน ExecutorService คุณสามารถเรียกใช้เมธอด shutdown ()

ผู้ปฏิบัติการService.shutdown ()

สิ่งนี้นำเราไปสู่ตอนท้ายของบทความนี้ซึ่งเราได้เรียนรู้วิธีที่เราสามารถใช้ ExecutorService เพื่อดำเนินงานในเธรด ฉันหวังว่าคุณจะชัดเจนกับทุกสิ่งที่แบ่งปันกับคุณในบทแนะนำนี้

หากคุณพบบทความเกี่ยวกับ“ ExecutorService ใน Java” ที่เกี่ยวข้องโปรดดูที่ไฟล์ บริษัท การเรียนรู้ออนไลน์ที่เชื่อถือได้พร้อมเครือข่ายผู้เรียนที่พึงพอใจมากกว่า 250,000 คนกระจายอยู่ทั่วโลก

เราพร้อมช่วยเหลือคุณในทุกขั้นตอนในการเดินทางและจัดทำหลักสูตรที่ออกแบบมาสำหรับนักเรียนและผู้เชี่ยวชาญที่ต้องการเป็น Java Developer หลักสูตรนี้ออกแบบมาเพื่อให้คุณเริ่มต้นการเขียนโปรแกรม Java และฝึกอบรมแนวคิด Java ทั้งหลักและขั้นสูงพร้อมกับแนวคิดต่างๆ ชอบ ไฮเบอร์เนต & .

หากคุณพบคำถามใด ๆ อย่าลังเลที่จะถามคำถามทั้งหมดของคุณในส่วนความคิดเห็นของ“ ExecutorService ใน Java” และทีมงานของเรายินดีที่จะตอบ