คลาส ThreadPoolExecutor
java.util.concurrent.ThreadPoolExecutor เป็น ExecutorService เพื่อดำเนินการแต่ละงานที่ส่งโดยใช้เธรดที่รวมกันหลายเธรดซึ่งปกติจะกำหนดค่าโดยใช้เมธอด Executors factory นอกจากนี้ยังมีวิธีการยูทิลิตี้ต่างๆเพื่อตรวจสอบสถิติเธรดปัจจุบันและควบคุม
วิธี ThreadPoolExecutor
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | protected void afterExecute(Runnable r, Throwable t) วิธีที่เรียกใช้เมื่อเสร็จสิ้นการดำเนินการ Runnable ที่กำหนด |
2 | void allowCoreThreadTimeOut(boolean value) ตั้งค่านโยบายที่ควบคุมว่าเธรดหลักอาจหมดเวลาและสิ้นสุดลงหากไม่มีงานใด ๆ มาถึงภายในช่วงเวลาที่มีชีวิตอยู่โดยจะถูกแทนที่หากจำเป็นเมื่อมีงานใหม่มาถึง |
3 | boolean allowsCoreThreadTimeOut() ส่งคืนค่าจริงหากพูลนี้อนุญาตให้เธรดคอร์หมดเวลาและยุติหากไม่มีงานใด ๆ มาถึงภายในเวลา KeepAlive ซึ่งจะถูกแทนที่หากจำเป็นเมื่อมีงานใหม่มาถึง |
4 | boolean awaitTermination(long timeout, TimeUnit unit) บล็อกจนกว่างานทั้งหมดจะเสร็จสิ้นการดำเนินการหลังจากการร้องขอการปิดระบบหรือการหมดเวลาเกิดขึ้นหรือเธรดปัจจุบันถูกขัดจังหวะขึ้นอยู่กับว่าสิ่งใดจะเกิดขึ้นก่อน |
5 | protected void beforeExecute(Thread t, Runnable r) วิธีที่เรียกใช้ก่อนที่จะดำเนินการ Runnable ที่กำหนดในเธรดที่กำหนด |
6 | void execute(Runnable command) ดำเนินการงานที่กำหนดในอนาคต |
7 | protected void finalize() เรียกใช้การปิดระบบเมื่อตัวดำเนินการนี้ไม่ได้อ้างอิงอีกต่อไปและไม่มีเธรด |
8 | int getActiveCount() ส่งคืนจำนวนเธรดโดยประมาณที่กำลังรันงานอยู่ |
9 | long getCompletedTaskCount() ส่งคืนจำนวนงานทั้งหมดโดยประมาณที่ดำเนินการเสร็จสิ้น |
10 | int getCorePoolSize() ส่งคืนจำนวนแกนของเธรด |
11 | long getKeepAliveTime(TimeUnit unit) ส่งกลับค่าเวลาคงอยู่ของเธรดซึ่งเป็นระยะเวลาที่เธรดที่เกินขนาดพูลแกนหลักอาจไม่ได้ใช้งานก่อนที่จะถูกยกเลิก |
12 | int getLargestPoolSize() ส่งคืนจำนวนเธรดที่มากที่สุดที่เคยอยู่ในพูลพร้อมกัน |
13 | int getMaximumPoolSize() ส่งคืนจำนวนเธรดสูงสุดที่อนุญาต |
14 | int getPoolSize() ส่งคืนจำนวนเธรดปัจจุบันในพูล |
15 | BlockingQueue
ส่งคืนคิวงานที่ใช้โดยตัวดำเนินการนี้ |
15 | RejectedExecutionHandler getRejectedExecutionHandler() ส่งคืนตัวจัดการปัจจุบันสำหรับงานที่ไม่สามารถดำเนินการได้ |
16 | long getTaskCount() ส่งคืนจำนวนงานทั้งหมดโดยประมาณที่เคยกำหนดไว้สำหรับการดำเนินการ |
17 | ThreadFactory getThreadFactory() ส่งคืนโรงงานเธรดที่ใช้ในการสร้างเธรดใหม่ |
18 | boolean isShutdown() ส่งคืนจริงหากตัวดำเนินการนี้ถูกปิด |
19 | boolean isTerminated() ส่งคืนค่าจริงหากงานทั้งหมดเสร็จสิ้นหลังจากปิดเครื่อง |
20 | boolean isTerminating() ส่งคืนค่าจริงหากตัวดำเนินการนี้อยู่ในกระบวนการยุติการทำงานหลังจากปิดระบบ () หรือ shutdownNow () แต่ยังไม่สิ้นสุดอย่างสมบูรณ์ |
21 | int prestartAllCoreThreads() เริ่มต้นเธรดหลักทั้งหมดทำให้ไม่ต้องรอการทำงาน |
22 | boolean prestartCoreThread() เริ่มเธรดหลักทำให้รอการทำงาน |
23 | void purge() พยายามลบออกจากคิวงานงานในอนาคตทั้งหมดที่ถูกยกเลิก |
24 | boolean remove(Runnable task) ลบงานนี้ออกจากคิวภายในของตัวดำเนินการหากมีอยู่ดังนั้นจึงทำให้งานนี้ไม่ถูกรันหากยังไม่ได้เริ่มทำงาน |
25 | void setCorePoolSize(int corePoolSize) ตั้งค่าจำนวนแกนของเธรด |
26 | void setKeepAliveTime(long time, TimeUnit unit) ตั้งค่าการ จำกัด เวลาที่เธรดอาจไม่ได้ใช้งานก่อนที่จะยุติ |
27 | void setMaximumPoolSize(int maximumPoolSize) ตั้งค่าจำนวนเธรดสูงสุดที่อนุญาต |
28 | void setRejectedExecutionHandler(RejectedExecutionHandler handler) ตั้งค่าตัวจัดการใหม่สำหรับงานที่ไม่สามารถดำเนินการได้ |
29 | void setThreadFactory(ThreadFactory threadFactory) ตั้งค่าโรงงานเธรดที่ใช้สร้างเธรดใหม่ |
30 | void shutdown() เริ่มต้นการปิดระบบอย่างเป็นระเบียบซึ่งมีการดำเนินงานที่ส่งไปก่อนหน้านี้ แต่จะไม่มีการยอมรับงานใหม่ |
31 | List<Runnable> shutdownNow() พยายามหยุดงานที่กำลังดำเนินการอยู่ทั้งหมดหยุดการประมวลผลของงานที่รอและส่งคืนรายการงานที่รอการดำเนินการ |
32 | protected void terminated() เรียกเมธอดเมื่อผู้ดำเนินการยกเลิก |
33 | String toString() ส่งคืนสตริงที่ระบุพูลนี้ตลอดจนสถานะรวมถึงการบ่งชี้สถานะการรันและจำนวนผู้ปฏิบัติงานและงานโดยประมาณ |
ตัวอย่าง
โปรแกรม TestThread ต่อไปนี้แสดงการใช้อินเตอร์เฟส ThreadPoolExecutor ในสภาพแวดล้อมแบบเธรด
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TestThread {
public static void main(final String[] arguments) throws InterruptedException {
ThreadPoolExecutor executor = (ThreadPoolExecutor)Executors.newCachedThreadPool();
//Stats before tasks execution
System.out.println("Largest executions: "
+ executor.getLargestPoolSize());
System.out.println("Maximum allowed threads: "
+ executor.getMaximumPoolSize());
System.out.println("Current threads in pool: "
+ executor.getPoolSize());
System.out.println("Currently executing threads: "
+ executor.getActiveCount());
System.out.println("Total number of threads(ever scheduled): "
+ executor.getTaskCount());
executor.submit(new Task());
executor.submit(new Task());
//Stats after tasks execution
System.out.println("Core threads: " + executor.getCorePoolSize());
System.out.println("Largest executions: "
+ executor.getLargestPoolSize());
System.out.println("Maximum allowed threads: "
+ executor.getMaximumPoolSize());
System.out.println("Current threads in pool: "
+ executor.getPoolSize());
System.out.println("Currently executing threads: "
+ executor.getActiveCount());
System.out.println("Total number of threads(ever scheduled): "
+ executor.getTaskCount());
executor.shutdown();
}
static class Task implements Runnable {
public void run() {
try {
Long duration = (long) (Math.random() * 5);
System.out.println("Running Task! Thread Name: " +
Thread.currentThread().getName());
TimeUnit.SECONDS.sleep(duration);
System.out.println("Task Completed! Thread Name: " +
Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้
เอาต์พุต
Largest executions: 0
Maximum allowed threads: 2147483647
Current threads in pool: 0
Currently executing threads: 0
Total number of threads(ever scheduled): 0
Core threads: 0
Largest executions: 2
Maximum allowed threads: 2147483647
Current threads in pool: 2
Currently executing threads: 2
Total number of threads(ever scheduled): 2
Running Task! Thread Name: pool-1-thread-2
Running Task! Thread Name: pool-1-thread-1
Task Completed! Thread Name: pool-1-thread-1
Task Completed! Thread Name: pool-1-thread-2