ภาษาการเขียนโปรแกรม Java ทำงานได้อย่างมีประสิทธิภาพมากกับ แอปพลิเคชั่นที่ต้องการให้งานดำเนินการพร้อมกันในเธรด เป็นเรื่องยากสำหรับแอปพลิเคชันใด ๆ ที่จะรันเธรดจำนวนมากพร้อมกัน เพื่อเอาชนะปัญหานี้ มาพร้อมกับ ExecutorService ซึ่งเป็นอินเทอร์เฟซย่อยของ . ในบทความนี้เราจะพูดถึงการทำงานของ ExecutorService ใน Java ต่อไปนี้เป็นหัวข้อที่กล่าวถึงในบล็อกนี้:
- Executor Framework คืออะไร?
- ExecutorService ในตัวอย่าง Java
- การใช้งาน Java ExecutorService
- การใช้งาน ExecutorService
- Runnable vs Callable
- การปิดระบบ ExecutorService
Executor Framework คืออะไร?
มันค่อนข้างง่ายกว่าที่จะสร้างและดำเนินการหนึ่งหรือสองเธรดพร้อมกัน แต่จะกลายเป็นเรื่องยากเมื่อจำนวนเธรดเพิ่มขึ้นเป็นจำนวนที่มีนัยสำคัญ แอพพลิเคชั่นแบบมัลติเธรดขนาดใหญ่จะมีเธรดหลายร้อยเธรดที่ทำงานพร้อมกัน ดังนั้นจึงเหมาะสมอย่างยิ่งที่จะแยกการสร้างเธรดออกจากการจัดการเธรดในแอปพลิเคชัน
ตัวดำเนินการคือ ช่วยคุณในการสร้างและจัดการเธรดในแอปพลิเคชัน ช่วยคุณในงานต่อไปนี้
การสร้างเธรด: มีวิธีการมากมายสำหรับการสร้างเธรดที่ช่วยในการรันแอปพลิเคชันของคุณพร้อมกัน
การจัดการเธรด: นอกจากนี้ยังจัดการวงจรชีวิตของเธรด คุณไม่จำเป็นต้องกังวลว่าเธรดจะทำงานไม่ว่างหรือตายก่อนที่จะส่งงานเพื่อดำเนินการ
การส่งงานและการดำเนินการ: เฟรมเวิร์กผู้ดำเนินการจัดเตรียมวิธีการสำหรับการส่งงานในเธรดพูลนอกจากนี้ยังให้อำนาจในการตัดสินใจว่าเธรดจะถูกดำเนินการหรือไม่
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” และทีมงานของเรายินดีที่จะตอบ