คุณสามารถลองใช้ประโยชน์จากรูปแบบคำสั่ง
class MyServiceManager {
public void execute(MyServiceTask tasks...) {
// set up everyting
MyService service = this.acquireService();
// execute the submitted tasks
foreach (Task task : tasks)
task.executeWith(service);
// cleanup yourself
service.releaseResources();
}
}
สิ่งนี้ทำให้คุณสามารถควบคุมการได้มาและปล่อยทรัพยากรได้อย่างสมบูรณ์ ผู้โทรส่งงานไปยังบริการของคุณเท่านั้นและคุณเองต้องรับผิดชอบในการจัดหาและล้างทรัพยากร
มีการจับเป็นอย่างไร ผู้เรียกยังคงสามารถทำได้:
MyServiceTask t1 = // some task
manager.execute(t1);
MyServiceTask t2 = // some task
manager.execute(t2);
แต่คุณสามารถแก้ไขปัญหานี้ได้เมื่อมันเกิดขึ้น เมื่อมีปัญหาเกี่ยวกับประสิทธิภาพและคุณพบว่าผู้โทรบางคนทำสิ่งนี้เพียงแสดงวิธีที่เหมาะสมและแก้ไขปัญหา:
MyServiceTask t1 = // some task
MyServiceTask t2 = // some task
manager.execute(t1, t2);
คุณสามารถสร้างความซับซ้อนได้ตามใจชอบโดยการปฏิบัติตามคำมั่นสัญญาสำหรับงานที่ต้องพึ่งพางานอื่น แต่การปล่อยสิ่งต่าง ๆ ก็มีความซับซ้อนมากขึ้น นี่เป็นเพียงจุดเริ่มต้น
async
ดังที่มีการระบุไว้ในความคิดเห็นข้างต้นไม่ได้ทำงานกับคำขอแบบอะซิงโครนัส ถูกต้อง. แต่สิ่งนี้สามารถแก้ไขได้อย่างง่ายดายใน Java 8 ด้วยการใช้CompleteableFutureโดยเฉพาะอย่างยิ่งCompleteableFuture#supplyAsync
เพื่อสร้างฟิวเจอร์สรายบุคคลและCompleteableFuture#allOf
เพื่อปล่อยทรัพยากรให้สมบูรณ์เมื่องานทั้งหมดเสร็จสิ้น อีกวิธีหนึ่งสามารถใช้เธรดหรือ ExecutorServices เพื่อหมุนการใช้งานฟิวเจอร์ส / สัญญาของตัวเอง