คำถามสัมภาษณ์เธรด Java
คำถามเกี่ยวกับมัลติเธรดและการทำงานพร้อมกันเป็นส่วนสำคัญของการสัมภาษณ์ Java หากคุณต้องการรับตำแหน่งข้อมูลแผนกต้อนรับส่วนหน้าของธนาคารเพื่อการลงทุนหุ้น คุณควรเตรียมคำถามมากมายเกี่ยวกับมัลติเธรด มัลติเธรดและการทำงานพร้อมกันเป็นหัวข้อยอดนิยมในวาณิชธนกิจ โดยเฉพาะอย่างยิ่งที่เกี่ยวข้องกับการพัฒนาการซื้อขายทางอิเล็กทรอนิกส์ พวกเขาถามคำถาม Java Threading ที่น่าสับสนมากมายแก่ผู้สัมภาษณ์ ผู้สัมภาษณ์เพียงต้องการให้แน่ใจว่าผู้สัมภาษณ์มีความรู้เพียงพอเกี่ยวกับเธรด Java และการทำงานพร้อมกัน เนื่องจากผู้สมัครจำนวนมากเพียงเริ่มต้นเท่านั้น ระบบการซื้อขายทางอิเล็กทรอนิกส์ที่มีปริมาณสูงและมีเวลาแฝงต่ำสำหรับการซื้อขายโดยตรงสู่ตลาดนั้นเกิดขึ้นพร้อมกันโดยธรรมชาติ ต่อไปนี้เป็นคำถาม Java Threading ที่ฉันชอบถามในเวลาที่ต่างกันและในสถานที่ต่างกัน ฉันไม่ได้ให้คำตอบ แต่ทุกครั้งที่เป็นไปได้ ฉันจะให้เบาะแสแก่คุณ และบางครั้งเบาะแสเหล่านั้นก็เพียงพอที่จะตอบคำถาม มีคำถามเพิ่มมากขึ้นเกี่ยวกับเครื่องมือการทำงานพร้อมกันและคอลเลกชันที่เกิดขึ้นพร้อมกันซึ่งอ้างอิงถึงแพ็คเกจ Java 5 Concurrency ในบรรดาปัญหาเหล่านั้น ThreadLocal, Blocking Queue, Counting Semaphore และ ConcurrentHashMap ได้รับความนิยมมากกว่า
15 คำถามและคำตอบสัมภาษณ์แบบมัลติเธรด Java
1) ขณะนี้มีสามเธรด T1, T2 และ T3 คุณจะแน่ใจได้อย่างไรว่า T2 จะถูกดำเนินการหลังจาก T1 ถูกดำเนินการ และ T3 จะถูกดำเนินการหลังจาก T2 ถูกดำเนินการ
คำถามชุดนี้มักจะถูกถามในระหว่างรอบแรกหรือขั้นตอนการสัมภาษณ์ทางโทรศัพท์ เพื่อทดสอบว่าคุณคุ้นเคยกับวิธีการ "เข้าร่วม" หรือไม่ ปัญหาแบบมัลติเธรดนี้ค่อนข้างง่าย และสามารถนำมาใช้ได้โดยใช้วิธีการรวม
2) ข้อดีของ Lock interface เหนือ synchronized block ใน Java คืออะไร? คุณต้องใช้แคชที่มีประสิทธิภาพซึ่งอนุญาตให้ผู้ใช้หลายคนอ่านได้ แต่อนุญาตให้ผู้ใช้เขียนได้เพียงคนเดียว ดังนั้นจึงรักษาความสมบูรณ์ของแคช คุณจะนำไปใช้อย่างไร
ข้อได้เปรียบที่ใหญ่ที่สุดของอินเทอร์เฟซการล็อคในการเขียนโปรแกรมแบบมัลติเธรดและพร้อมกันคือมีการล็อคแยกต่างหากสำหรับการอ่านและการเขียน ซึ่งช่วยให้คุณสามารถเขียนโครงสร้างข้อมูลที่มีประสิทธิภาพสูง เช่น ConcurrentHashMap และการบล็อกแบบมีเงื่อนไข คำถามสัมภาษณ์เธรด Java นั้นขึ้นอยู่กับคำตอบของผู้สัมภาษณ์มากขึ้น ฉันขอแนะนำให้อ่าน Locks ก่อนที่คุณจะไปสัมภาษณ์แบบหลายเธรด เนื่องจากปัจจุบันมีการใช้กันอย่างแพร่หลายในการแคชฝั่งไคลเอ็นต์และพื้นที่การเชื่อมต่อการซื้อขายสำหรับการสร้างเทอร์มินัลการซื้อขายทางอิเล็กทรอนิกส์
3) อะไรคือความแตกต่างระหว่างวิธีการ wait และ sleep ใน java?
คำถามสัมภาษณ์เธรด Java ที่มักจะถามในการสัมภาษณ์ทางโทรศัพท์ ความแตกต่างที่ใหญ่ที่สุดคือการรอปลดล็อคในขณะที่รอ ในขณะที่การนอนหลับจะล็อคล็อคไว้เสมอ โดยปกติการรอจะใช้สำหรับการโต้ตอบระหว่างเธรด และโดยปกติจะใช้โหมดสลีปเพื่อหยุดการดำเนินการชั่วคราว
4) ใช้ Java เพื่อใช้การบล็อกคิว
นี่เป็นคำถามสัมภาษณ์แบบหลายเธรดที่ค่อนข้างยากซึ่งมีจุดประสงค์หลายอย่าง ขั้นแรก สามารถทดสอบว่าผู้สมัครสามารถเขียนโปรแกรมโดยใช้ Java threads ได้จริงหรือไม่ ประการที่สอง ทดสอบความเข้าใจของผู้สมัครเกี่ยวกับสถานการณ์การทำงานพร้อมกันได้ และคุณสามารถถามคำถามมากมายจากสิ่งนี้ หากเขาใช้เมธอด wait() และ notify() เพื่อใช้คิวการบล็อก คุณสามารถขอให้เขาเขียนมันอีกครั้งโดยใช้คลาสการทำงานพร้อมกันล่าสุดใน Java 5
5) เขียนโค้ดใน Java เพื่อแก้ปัญหาผู้ผลิต-ผู้บริโภค
มันคล้ายกับคำถามข้างต้นมาก แต่คำถามนี้คลาสสิกกว่า บางครั้งการสัมภาษณ์จะถามคำถามต่อไปนี้ วิธีแก้ปัญหาระหว่างผู้ผลิตและผู้บริโภคใน Java แน่นอนว่ามีวิธีแก้ไขมากมายฉันได้แบ่งปันวิธีการโดยใช้การบล็อกคิว บางครั้งพวกเขาถึงกับถามถึงวิธีการนำปัญหาของนักปรัชญาด้านอาหารไปใช้
6) หากคุณเขียนโปรแกรมด้วยภาษา Java จนเกิดการชะงักงัน คุณจะแก้ไขอย่างไร?
นี่เป็นคำถามสัมภาษณ์เธรด Java ที่ฉันชื่นชอบเพราะถึงแม้ปัญหาการหยุดชะงักจะพบได้บ่อยมากเมื่อเขียนโปรแกรมที่ทำงานพร้อมกันแบบมัลติเธรด แต่ผู้สมัครจำนวนมากไม่สามารถเขียนโค้ดที่ไม่มีการหยุดชะงักได้ (โค้ดที่ไม่มีการหยุดชะงักใช่หรือไม่) และพวกเขาก็ประสบปัญหา เพียงบอกพวกเขาว่าคุณมีทรัพยากร N และเธรด N และคุณต้องการทรัพยากรทั้งหมดเพื่อดำเนินการให้เสร็จสมบูรณ์ เพื่อความง่าย คุณสามารถแทนที่ n ที่นี่ด้วย 2 ได้ ข้อมูลที่มีขนาดใหญ่กว่าจะทำให้ปัญหาดูซับซ้อนมากขึ้น รับข้อมูลเพิ่มเติมเกี่ยวกับการหยุดชะงักโดยหลีกเลี่ยงการหยุดชะงักใน Java
7) การดำเนินการของอะตอมมิกคืออะไร การดำเนินการของอะตอมมิกใน Java คืออะไร?
คำถามสัมภาษณ์เธรด Java ง่ายๆ คำถามถัดไปคือคุณต้องซิงโครไนซ์การดำเนินการแบบอะตอมมิก
8) บทบาทสำคัญของความผันผวนใน Java คืออะไร? วิธีการใช้งาน? มันแตกต่างจากวิธีการซิงโครไนซ์ใน Java อย่างไร?
เนื่องจาก Java 5 และโมเดลหน่วยความจำ Java มีการเปลี่ยนแปลง ปัญหาการเธรดตามคีย์เวิร์ดระเหยจึงได้รับความนิยมมากขึ้น คุณควรเตรียมพร้อมที่จะตอบคำถามว่าตัวแปรผันผวนช่วยให้มั่นใจในการมองเห็น การจัดลำดับ และความสม่ำเสมอในสภาพแวดล้อมที่เกิดขึ้นพร้อมกันได้อย่างไร
9) สภาพการแข่งขันคืออะไร? คุณจะระบุและแก้ไขการแข่งขันได้อย่างไร?
นี่เป็นคำถามที่เกิดขึ้นในขั้นตอนขั้นสูงของการสัมภาษณ์แบบหลายเธรด ผู้สัมภาษณ์ส่วนใหญ่จะถามเกี่ยวกับสภาวะการแข่งขันที่คุณพบเมื่อเร็วๆ นี้ และคุณจะแก้ไขได้อย่างไร บางครั้งพวกเขาจะเขียนโค้ดง่ายๆ และให้คุณตรวจสอบสภาพการแข่งขันในโค้ดได้ คุณสามารถดูบทความก่อนหน้าของฉันเกี่ยวกับสภาพการแข่งขันของ Java ในความเห็นของฉัน นี่เป็นหนึ่งในคำถามสัมภาษณ์ Java Thread ที่ดีที่สุด ซึ่งสามารถตรวจจับประสบการณ์ของผู้สมัครในการแก้ไขสภาพการแข่งขันได้อย่างแม่นยำ หรือการเขียนโค้ดที่ไม่มี Data Race หรือสภาพการแข่งขันอื่นๆ (ประโยคนี้ซึ่งไม่มี Data Race จะ ไม่ได้แปล) หนังสือที่ดีที่สุดในหัวข้อนี้คือ "การปฏิบัติพร้อมกันใน Java"
10) คุณจะใช้ thread dump อย่างไร? คุณจะวิเคราะห์การถ่ายโอนข้อมูลของเธรดอย่างไร
ใน UNIX คุณสามารถใช้ kill -3 และ thread dump จะพิมพ์บันทึก ใน windows คุณสามารถใช้ "CTRL+Break" คำถามสัมภาษณ์กระทู้ที่เรียบง่ายและเป็นมืออาชีพ แต่จะยุ่งยากหากเขาถามคุณว่าจะวิเคราะห์อย่างไร
11) เหตุใดเมธอด run() จึงดำเนินการเมื่อเราเรียกใช้เมธอด start() ทำไมเราไม่สามารถเรียกใช้เมธอด run() ได้โดยตรง
นี่เป็นอีกคำถามสัมภาษณ์ Java multi-threading ที่คลาสสิกมาก นี่เป็นความสับสนของฉันเช่นกันเมื่อฉันเริ่มเขียนโปรแกรมเธรดครั้งแรก ปัจจุบันนี้คำถามนี้มักจะถูกถามในการสัมภาษณ์ทางโทรศัพท์หรือในรอบแรกของการสัมภาษณ์ Java ระดับเริ่มต้นถึงระดับกลาง คำตอบสำหรับคำถามนี้ควรเป็นดังนี้ เมื่อคุณเรียกใช้เมธอด start() คุณจะสร้างเธรดใหม่และรันโค้ดในเมธอด run() แต่ถ้าคุณเรียกใช้เมธอด run() โดยตรง มันจะไม่สร้างเธรดใหม่และจะไม่รันโค้ดของเธรดที่เรียก อ่านบทความก่อนหน้าของฉัน "ความแตกต่างระหว่างวิธีการเริ่มและเรียกใช้" สำหรับข้อมูลเพิ่มเติม
12) คุณจะปลุกเธรดที่ถูกบล็อกใน Java ได้อย่างไร?
นี่เป็นคำถามที่ยากเกี่ยวกับเธรดและการบล็อก และมีวิธีแก้ปัญหามากมาย ฉันไม่คิดว่าจะมีวิธียกเลิกเธรดได้หากพบบล็อก IO หากเธรดถูกบล็อกโดยการเรียก wait(), sleep() หรือ join() คุณสามารถขัดจังหวะเธรดและปลุกเธรดนั้นได้โดยการโยน InterruptedException บทความก่อนหน้าของฉัน "วิธีจัดการกับวิธีการบล็อกใน java" มีข้อมูลมากมายเกี่ยวกับการจัดการกับการบล็อกเธรด
13) CycliBarriar และ CountdownLatch ใน Java แตกต่างกันอย่างไร?
คำถามเธรดนี้ส่วนใหญ่จะใช้เพื่อทดสอบว่าคุณคุ้นเคยกับแพ็คเกจที่เกิดขึ้นพร้อมกันใน JDK5 หรือไม่ ข้อแตกต่างระหว่างทั้งสองคือ CyclicBarrier สามารถนำแผงกั้นที่ผ่านไปแล้วกลับมาใช้ใหม่ได้ ในขณะที่ CountdownLatch ไม่สามารถนำมาใช้ซ้ำได้
14) วัตถุที่ไม่เปลี่ยนรูปคืออะไร และช่วยเขียนแอปพลิเคชันพร้อมกันได้อย่างไร
คำถามสัมภาษณ์คลาสสิกอีกข้อเกี่ยวกับมัลติเธรด มันไม่เกี่ยวข้องโดยตรงกับเธรด แต่ช่วยได้มากทางอ้อม คำถามสัมภาษณ์ Java นี้อาจยุ่งยากมากหากเขาขอให้คุณเขียนวัตถุที่ไม่เปลี่ยนรูป หรือถามคุณว่าทำไม String จึงไม่เปลี่ยนรูป
15) อะไรคือปัญหาทั่วไปที่คุณพบในสภาพแวดล้อมแบบมัลติเธรด? คุณแก้ปัญหาได้อย่างไร?
ที่พบบ่อยในโปรแกรมแบบมัลติเธรดและทำงานพร้อมกันได้แก่ อินเทอร์เฟซหน่วยความจำ สภาวะการแข่งขัน การหยุดชะงัก ไลฟ์ล็อค และความอดอยาก ปัญหาไม่มีที่สิ้นสุด และหากคุณทำผิด ก็จะเป็นการยากที่จะค้นหาและแก้ไขข้อบกพร่อง นี่เป็นคำถามเชิงสัมภาษณ์เป็นส่วนใหญ่และไม่ใช่คำถามเกี่ยวกับเธรด Java ที่ใช้แอปพลิเคชันเชิงปฏิบัติ
คำถามเพิ่มเติมสองสามข้อ:
1) อะไรคือความแตกต่างระหว่างเธรดสีเขียวและเธรดในเครื่องใน Java?
2) เธรดและกระบวนการแตกต่างกันอย่างไร?
3) การสลับบริบทในมัลติเธรดคืออะไร?
4) อะไรคือความแตกต่างระหว่างการหยุดชะงักและการหยุดชะงัก และความแตกต่างระหว่างการหยุดชะงักและการพาย?
5) อัลกอริธึมการตั้งเวลาเธรดที่ใช้ใน Java คืออะไร?
6) การตั้งเวลาเธรดใน Java คืออะไร?
7) คุณจะจัดการกับข้อยกเว้นที่ไม่สามารถจับได้ในเธรดอย่างไร
8) กลุ่มเธรดคืออะไร และเหตุใดจึงไม่แนะนำใน Java?
9) เหตุใดการใช้ Executor Framework จึงดีกว่าการใช้แอปพลิเคชันเพื่อสร้างและจัดการเธรด
10) ความแตกต่างระหว่าง Executor และ Executors ใน Java คืออะไร?
11) จะค้นหาเธรดใดที่ใช้เวลา CPU มากที่สุดบน Windows และ Linux ได้อย่างไร?