1. ผู้บริหาร
คลาส Executors ถือได้ว่าเป็น "คลาสเครื่องมือ" อ้างถึงการแนะนำใน JDK1.6 API:
วิธีการในโรงงานและการปฏิบัติของผู้ดำเนินการ, ExecutorService, ScheduleDexecutorService, ThreadFactory และคลาสที่เรียกว่า Callable ที่กำหนดไว้ในแพ็คเกจนี้ คลาสนี้รองรับวิธีการต่าง ๆ :
(1) สร้างและส่งคืนวิธีการตั้งค่า ExecutorService ด้วยสตริงการกำหนดค่าที่ใช้กันทั่วไป
(2) สร้างและส่งคืนวิธีการตั้งค่า ScheduleDexecutorService ด้วยสตริงการกำหนดค่าที่ใช้กันทั่วไป
(3) สร้างและส่งคืนวิธีการ ExecutorService "ห่อ" ซึ่งปิดการกำหนดค่าใหม่โดยการใช้วิธีการเฉพาะการใช้งานที่ไม่สามารถเข้าถึงได้
(4) สร้างและส่งคืนวิธีการของ ThreadFactory ซึ่งสามารถตั้งค่าเธรดที่สร้างขึ้นใหม่ให้เป็นสถานะที่รู้จัก
(5) สร้างและส่งคืนวิธีการเรียกที่ไม่ถูกปิดเพื่อให้สามารถใช้ในวิธีการดำเนินการที่ต้องใช้เรียกได้
ผ่านชั้นเรียนนี้คุณสามารถรับพูลเธรดหลายอินสแตนซ์เช่นการโทร NewsingLetHreatHreadExecutor () เพื่อรับ ExecutorService แบบเธรดเดี่ยวโทร Newfixedthreadpool () เพื่อรับ Executorservice ของพูลเธรดขนาดคงที่ ฯลฯ มีสิ่งที่คุณสามารถทำได้ สิ่งที่ง่ายที่สุดคือการใช้มันเพื่อเรียกใช้งานวัตถุที่เรียกใช้งานได้หรือคุณสามารถเรียกใช้งานวัตถุบางอย่างที่ใช้งานได้ <t> ไม่มีค่าส่งคืนโดยใช้วิธีการเริ่มต้น () ของเธรด หากวิธีการที่ดำเนินการโดยเธรดมีค่าส่งคืนมันจะดีกว่าที่จะใช้ ExecutorService คุณสามารถเลือก subment (), invokeall () หรือ invokeany () และเลือกวิธีที่เหมาะสมตามสถานการณ์เฉพาะ
วิธีการบางอย่างที่มีให้ในชั้นนี้คือ:
1.1 Public ExecutorService Newcachedthreadpool ()
สร้างพูลเธรดที่สร้างเธรดใหม่ตามต้องการ แต่จะนำกลับมาใช้ใหม่เมื่อมีเธรดที่สร้างขึ้นก่อนหน้านี้ พูลเธรดเหล่านี้มักจะปรับปรุงประสิทธิภาพของโปรแกรมสำหรับโปรแกรมที่ดำเนินงานอะซิงโครนัสระยะสั้นจำนวนมาก
1.2 Public ExecutorService NewFixedThreadPool (int nthreads)
สร้างพูลเธรดที่มีเธรดที่ใช้ซ้ำได้จำนวนคงที่เพื่อเรียกใช้เธรดเหล่านี้ในคิวที่ไม่ได้ จำกัด
1.3 Public ExecutorService NewsingLetHreatHreadExecutor ()
สร้างผู้ดำเนินการที่ใช้เธรดคนงานเดี่ยวเพื่อเรียกใช้เธรดในคิวที่ไม่มีขอบเขต
ทั้งสามวิธีสามารถใช้กับอินสแตนซ์ของอินเทอร์เฟซ ThreadFactory และส่งคืนอินสแตนซ์ของอินเทอร์เฟซ ExecutorService
2. อินเตอร์เฟส ThreadFactory
สร้างวัตถุเธรดใหม่ตามต้องการ การใช้โรงงานเธรดไม่จำเป็นต้องมีการเขียนด้วยตนเองของการโทรแบบใหม่เพื่อให้แอปพลิเคชันสามารถใช้คลาสย่อยเธรดพิเศษคุณสมบัติ ฯลฯ
การใช้งานที่ง่ายที่สุดของอินเทอร์เฟซนี้คือ:
คลาส SimpleThreadFactory ใช้ ThreadFactory {เธรดสาธารณะ newThread (runnable r) {ส่งคืนเธรดใหม่ (r); - 3. อินเตอร์เฟส ExecutorService
อินเทอร์เฟซนี้มีวิธีการจัดการการเลิกจ้าง
4. สร้างเธรดเริ่มต้นพูลเธรดมาตรฐาน
4.1 ให้เธรดง่าย ๆ ที่ใช้อินเทอร์เฟซที่รันได้
Mythread.java
แพ็คเกจ com.zj.concurrency.executors; คลาสสาธารณะ MyThread ใช้งาน Runnable {Private Int Count = 1, Number; Public Mythread (int num) {number = num; System.out.println ("สร้างเธรด-" + หมายเลข); } โมฆะสาธารณะเรียกใช้ () {ในขณะที่ (จริง) {system.out.println ("เธรด-" + number + "run" + count + "เวลา)); if (++ count == 3) return; - เธรดนี้จะพิมพ์ข้อมูลการสร้างและการดำเนินการที่สอดคล้องกัน
4.2 เริ่มเธรดโดยใช้ cachedthreadpool
cachedthreadpool.java
แพ็คเกจ com.zj.concurrency.executors; นำเข้า java.util.concurrent.executorservice; นำเข้า java.util.concurrent.executors; คลาสสาธารณะ cachedthreadpool {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {executorService exec = executors.newcachedthreadpool (); สำหรับ (int i = 0; i <5; i ++) exec.execute (ใหม่ mythread (i)); Exec.Shutdown (); - ผลลัพธ์:
สร้าง Thread-0Create Thread-1Create Thread-2Create Thread-3THREAD-0 RUN 1 TIME (S) Thread-0 รัน 2 ครั้ง (S) Thread-1 Run 1 Time (S) Thread-1 Run 2 Time (S) Thread-2 Run 1 Time (S) THREH-2 RUN 2 TIME SITRE-THREH-3
4.3 เริ่มเธรดโดยใช้ reamiedthreadpool
recidethreadpool.javapackage com.zj.concurrency.executors; นำเข้า java.util.concurrent.executorservice; นำเข้า java.util.concurrent.executors; คลาสสาธารณะ recideThreadPool {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ExecutoRservice exec = executors.newFixedThreadPool (2); สำหรับ (int i = 0; i <5; i ++) exec.execute (ใหม่ mythread (i)); Exec.Shutdown (); - ผลลัพธ์:
สร้าง Thread-0CreateDe-1Create Thread-2Create Thread-3Create Thread-4Thread-0 รัน 1 เวลา Thread-0 รัน 2 เวลา (s) เธรด -2 รัน 1 เวลา (s) เธรด -2 รัน 2 เวลา (s) การรัน 1 เวลา (S) thread-3 run 2 ครั้ง
4.4 เริ่มเธรดโดยใช้ SingLetHreadExecutor
singlethreathedexecutor.java
แพ็คเกจ com.zj.concurrency.executors; นำเข้า java.util.concurrent.executorservice; นำเข้า java.util.concurrent.executors; ระดับสาธารณะ singlethreathedexecutor {public static void main (string [] args) {executorservice exec = executors.newsinglethreathedexecutor (); สำหรับ (int i = 0; i <5; i ++) exec.execute (ใหม่ mythread (i)); Exec.Shutdown (); - ผลลัพธ์:
สร้างเธรด -0CreateDe-1Create Thread-2Create Thread-3Create Thread-4THREAD-0 RUN 1 ครั้ง (S) Thread-0 รัน 2 เวลา (S) Thread-1 Run 1 Time (S) Thread-1 Run 2 THED (S) การรัน 1 เวลา (S) THREH-2 RUN 2 THREH 2 THREIND (S)
5. ร่วมมือกับการใช้อินเทอร์เฟซ ThreadFactory
เรากำลังพยายามเพิ่มการตั้งค่าแอตทริบิวต์ daemon และลำดับความสำคัญในเธรด
5.1 ตั้งค่าคุณสมบัติเธรดพื้นหลัง
daemonthreadfactory.java
แพ็คเกจ com.zj.concurrency.executors.factory; นำเข้า java.util.concurrent.threadfactory; Public Class DaemonthreadFactory ใช้ ThreadFactory {เธรดสาธารณะ newThread (runnable r) {เธรด t = เธรดใหม่ (r); T.Setdaemon (จริง); กลับ t; -
5.2 ตั้งค่าคุณสมบัติลำดับความสำคัญ
maxprioritythreadfactory.java
แพ็คเกจ com.zj.concurrency.executors.factory; นำเข้า java.util.concurrent.threadfactory; คลาสสาธารณะ MaxPriorityThreadFactory ใช้ ThreadFactory {เธรดสาธารณะ newThread (runnable r) {เธรด t = เธรดใหม่ (r); t.setPriority (thread.max_priority); กลับ t; - PriorityMinpriorityThfactory.java ขั้นต่ำ
แพ็คเกจ com.zj.concurrency.executors.factory; นำเข้า java.util.concurrent.threadfactory; คลาสสาธารณะ minpriorityThreadFactory ใช้ ThreadFactory {เธรดสาธารณะ newThread (runnable r) {เธรด t = เธรดใหม่ (r); t.setPriority (thread.min_priority); กลับ t; -
5.3 เริ่มเธรดด้วยการตั้งค่าแอตทริบิวต์
ExecFromFactory.java
แพ็คเกจ com.zj.concurrency.executors; นำเข้า java.util.concurrent.executorservice; นำเข้า java.util.concurrent.executors; นำเข้า com.zj.concurrency.executors.factory.daemonthreadfactory; com.zj.concurrency.executors.factory.minprioritythreadfactory; คลาสสาธารณะ ExecFromFactory {โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {ExecutoRservice defaultExec = executors.newCachedThreadPool (); ExecutorService daemonexec = executors .newcachedThreadPool (ใหม่ daemonthreadfactory ()); ExecutorService MaxPriorityExec = Executors .NewCachedThreadPool (ใหม่ MaxPriorityThadFactory ()); ExecutorService minpriorityExec = Executors .newcachedThreadPool (ใหม่ minpriorityThreadFactory ()); สำหรับ (int i = 0; i <10; i ++) daemonexec.execute (New Mythread (i)); สำหรับ (int i = 10; i <20; i ++) ถ้า (i == 10) maxpriorityExec.execute (ใหม่ mythread (i)); อย่างอื่นถ้า (i == 11) minpriorityExec.execute (New Mythread (i)); else defaultExec.execute (New MyThread (i)); - ผลลัพธ์:
สร้างเธรด -0CreateTe Thread-1Create Thread-2Create Thread-3THREAD-0 RUN 1 TIME (S) Thread-0 Run 2 Time (S) Thread-1 Run 1 Time (S) Thread-1 Run 2 Time (S) Thread-2 Run 1 Time (S) THREH-2 RUN 2 TIME-THREAD-5 THREAD-5 THREAD-5 Thread-6Create Thread-7Thread-7 Run 1 เวลา (S) เธรด -7 รัน 2 ครั้ง (s) สร้างเธรด -8Thread-8 รัน 1 เวลา (s) เธรด -8 รัน 2 เวลา (s) สร้างเธรด-9Create-10THREAD-10 RUN 1 TIME (S) THREIND-RUN THRIMHT-6 เวลา (s) เธรด -3 รัน 1 เวลา (s) เธรด -3 รัน 2 เวลา (s) สร้างเธรด -12Create Thread-13create Thread-14thread-12 Run 1 Time (S) Thread-12 Run 2 Time (S) THREAL-13 RUN 1 THE THREID (S) THRIVE-13 THRIVEL 2 THREID (S) เวลาสร้างเธรด -17Create Thread-18Create Thread-19thread-14 รัน 1 เวลา Thread-14 run 2 ครั้ง (S) Thread-17 Run 1 Time (S) THREAD-17 RUN 2 THED (S) THREAL-18 RUN 1 TIME (S) THREH-18 RUN 2 ครั้ง