เพื่อปรับปรุงความเสถียรด้านประสิทธิภาพของปริมาณการทำงานร่วมกันขนาดใหญ่ในโครงการสระว่ายน้ำเธรดมักจะใช้ในการดำเนินการแบบอะซิงโครนัสแบบมัลติเธรด มัลติเธรดมีสองประเภท หนึ่งคือการใช้อินเทอร์เฟซ Runnable ซึ่งไม่มีค่าส่งคืนและอื่น ๆ คือการใช้อินเตอร์เฟส callable ซึ่งมีค่าส่งคืน
เมื่อหนึ่งในเธรดที่หมดเวลามันไม่ควรส่งผลกระทบต่อผลการดำเนินการของเธรดอื่น ๆ ในทางทฤษฎี แต่ปัญหาที่เกิดขึ้นในโครงการระบุว่าหนึ่งเธรดถูกบล็อกและอินเตอร์เฟสที่ส่งคืนโดยเธรดอื่นจะว่างเปล่า ที่จริงแล้วมันเป็นคำถามที่ง่ายมาก แต่เพราะฉันพบมันเป็นครั้งแรกฉันยังคงคิดถึงเรื่องนี้อยู่พักหนึ่ง มันง่ายมากมันเป็นเพราะเส้นบล็อก
กระบวนการไม่ได้ถูกปล่อยออกมาและเมื่อจำนวนเงินพร้อมกันมีขนาดใหญ่จำนวนพูลเธรดจะเต็มดังนั้นเธรดอื่น ๆ จะอยู่ในสถานะรอ
แนบเป็นรหัสการดีบักที่ฉันเขียนด้วยตัวเอง เมื่อฉันไม่สามารถนึกถึงปัญหาได้ฉันจะจำลองมันและบางทีปัญหาจะออกมา
นำเข้า java.util.concurrent.callable; นำเข้า java.util.concurrent.executionexception; นำเข้า java.util.concurrent.executorservice; นำเข้า java.util.concurrent.executors; java.util.concurrent.timeoutexception; ชั้นเรียนสาธารณะ FutureTest {โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่น InterruptedException, ExecutionException, TimeOutException callable <string> call = new callable <string> () {การเรียกสตริงสาธารณะ () พ่น InterruptedException {// เริ่มดำเนินการใช้งาน thread.sleep (1000 * 2); กลับ "1 การดำเนินการเธรดเสร็จสมบูรณ์"; - callable <string> call2 = ใหม่ callable <string> () {การเรียกสตริงสาธารณะ () พ่นข้อยกเว้น {// เริ่มดำเนินการทำงานที่ใช้เวลานาน // thread.sleep (1000 * 5); return "การดำเนินการเธรด 2 เสร็จสิ้น"; - callable <string> call3 = ใหม่ callable <string> () {การเรียกสตริงสาธารณะ () พ่นข้อยกเว้น {// เริ่มดำเนินการทำงานที่ใช้เวลานาน // thread.sleep (1000 * 5); return "3 การดำเนินการเธรดเสร็จสมบูรณ์"; - อนาคต <String> future = exec.submit (โทร); อนาคต <String> future3 = exec.submit (call3); อนาคต <String> future2 = exec.submit (call2); สตริง obj = ""; สตริง obj2 = ""; สตริง obj3 = ""; ลอง {obj = future.get (500, timeunit.milliseconds); // ตั้งค่าการหมดเวลาการประมวลผลงานเป็น} // 1 การจับที่สอง (ข้อยกเว้น e) {system.out.println ("หมดเวลาประมวลผล .... "); E.PrintStackTrace (); } ลอง {obj3 = future3.get (3000, timeunit.milliseconds); // ตั้งค่าหมดเวลาการประมวลผลงานเป็น} // 1 การจับที่สอง (ข้อยกเว้น e) {system.out.println ("การหมดเวลาประมวลผล ...... "); E.PrintStackTrace (); } ลอง {obj2 = future2.get (3000, timeunit.milliseconds);} catch (Exception e) {system.out.println ("การประมวลผลหมดเวลา .... "); E.PrintStackTrace (); } system.out.println ("3 งานส่งคืนสำเร็จ:" + obj3); System.out.println ("2 งานส่งคืนสำเร็จ:" + obj2); System.out.println ("1 งานส่งคืนสำเร็จ:" + obj); Exec.Shutdown (); -ข้างต้นคือการอภิปรายสั้น ๆ เกี่ยวกับข้อยกเว้นบริการที่เกิดจากการหมดเวลาหลายเธรดแบบอะซิงโครนัสในชวา ฉันหวังว่าทุกคนจะสนับสนุน wulin.com เพิ่มเติม ~