มัลติเธรดแตกต่างกันอย่างไรในแอปพลิเคชันบนเว็บที่ใช้ Java เทียบกับแอปพลิเคชัน Java สแตนด์อะโลน


13

ฉันค่อนข้างใหม่สำหรับ Java และประสบการณ์ของฉันถูก จำกัด เฉพาะแอปพลิเคชันบนเว็บที่ทำงานบน Web Container (Jboss ในกรณีของฉัน)

ฉันถูกต้องหรือไม่ที่บอกว่าสำหรับเว็บแอปพลิเคชั่นเว็บคอนเทนเนอร์จะดูแลมัลติเธรดหรือไม่ ถ้าเป็นเช่นนั้นฉันสามารถแนะนำดอกยางใหม่ในแอพพลิเคชั่นบนเว็บได้หรือไม่? มีข้อได้เปรียบในการทำเช่นนั้นหรือไม่และในสถานการณ์ใดที่จะต้องทำเช่นนั้น?


จนถึง EE6 คุณจะไม่ใช้หัวข้อ; Concurrency Utilitiesแนะนำ EE7
Reinstate Monica - M. Schröder

คำตอบ:


20

ฉันถูกต้องหรือไม่ที่บอกว่าสำหรับเว็บแอปพลิเคชั่นเว็บคอนเทนเนอร์จะดูแลมัลติเธรดหรือไม่

เว็บเซิร์ฟเวอร์ส่วนใหญ่ (Java และอื่น ๆ รวมถึง JBoss) เป็นไปตามรูปแบบ "หนึ่งเธรดต่อคำขอ" นั่นคือแต่ละคำขอ HTTP จะถูกประมวลผลอย่างสมบูรณ์โดยหนึ่งกระทู้ เธรดนี้มักจะใช้เวลาส่วนใหญ่รอสิ่งต่าง ๆ เช่นการร้องขอ DB เว็บคอนเทนเนอร์จะสร้างเธรดใหม่ตามความจำเป็น

เซิร์ฟเวอร์บางตัว (ในระบบนิเวศ Java ส่วนใหญ่เป็นNetty ) ทำการจัดการคำขอแบบอะซิงโครนัสทั้งที่มีโมเดล "หนึ่งเธรดทำทุกอย่าง" หรือสิ่งที่ซับซ้อนกว่า แนวคิดพื้นฐานคือมีการรอเธรดจำนวนมากทำให้สิ้นเปลืองทรัพยากรดังนั้นการทำงานแบบอะซิงโครนัสจะมีประสิทธิภาพมากขึ้น

ถ้าเป็นเช่นนั้นฉันสามารถแนะนำดอกยางใหม่ในแอพพลิเคชั่นบนเว็บได้หรือไม่?

เป็นไปได้ แต่ควรทำอย่างระมัดระวังเนื่องจากข้อผิดพลาด (เช่นการรั่วไหลของหน่วยความจำหรือการประสานที่ขาดหายไป) สามารถทำให้เกิดข้อบกพร่องที่ยากที่จะทำซ้ำหรือทำให้เซิร์ฟเวอร์ทั้งหมดล่ม

มีข้อได้เปรียบในการทำเช่นนั้นหรือไม่และในสถานการณ์ใดที่จะต้องทำเช่นนั้น?

ข้อดีคือคุณสามารถทำสิ่งต่าง ๆ ในแบบคู่ขนาน การใช้เธรดเพื่อปรับปรุงความเร็วในการคำนวณล้วนเป็นสิ่งที่คุณไม่ควรทำบนเว็บเซิร์ฟเวอร์เพราะมันจะทำให้การจัดการคำขออื่นช้าลง สิ่งนั้นควรทำในเซิร์ฟเวอร์แยกต่างหากอาจใช้คิวงานบางประเภท

สถานการณ์ที่ถูกต้องตามกฎหมายสำหรับการทำมัลติเธรดในบริบทของการจัดการคำขอ HTTP อาจเป็นได้ถ้าคุณต้องการเข้าถึงทรัพยากรเครือข่ายอื่น ๆ เช่นเรียกใช้บริการเว็บต่างๆ หากคุณทำในทราฟเดียวคุณต้องรอให้การโทรแต่ละครั้งสิ้นสุดลง แต่ถ้าคุณใช้หลายเธรดเวลาที่รอทั้งหมดเป็นเพียงการหน่วงเวลาของการเรียกที่ช้าที่สุด


3
มีเหตุผล. ExecutorService Interface เป็นวิธีที่ดีที่สุดในการสร้างเธรดใหม่ในเว็บแอปพลิเคชันหรือไม่
kapricanon

4
@kapricanon: ใช่เว้นแต่คุณจะมีข้อกำหนดเฉพาะที่ไม่สามารถจัดการได้หรือเว็บเซิร์ฟเวอร์ของคุณมีบางสิ่งที่คล้ายกันอยู่แล้ว
Michael Borgwardt

2

ในการตอบคำถามของคุณ:

มัลติเธรดแตกต่างกันอย่างไรในแอปพลิเคชันบนเว็บที่ใช้ Java เทียบกับแอปพลิเคชัน Java สแตนด์อะโลน

มันไม่แตกต่างกัน โดยปกติแล้วเว็บแอปพลิเคชั่นซอฟต์แวร์ที่สร้างขึ้นจะให้เธรดหลายเธรดอยู่แล้วโดยการขอแต่ละเธรดใหม่ โดยคุณสามารถใช้ / สร้างเธรดเหมือนกับแอปพลิเคชันอื่น ๆ

การมัลติเธรดที่แน่นอนสามารถเพิ่มประสิทธิภาพได้อย่างมากหากคุณใช้งานถูกต้อง สำหรับงานที่ต้องใช้ I / O เช่นการเข้าถึงเครือข่ายและการเข้าถึงดิสก์ไดรฟ์การเพิ่มประสิทธิภาพนั้นเกือบจะรับประกันได้เสมอ สำหรับงานที่ต้องคำนวณอย่างเข้มข้นคุณควรปฏิบัติตามกฎของหนึ่งเธรดต่อหนึ่งคอร์ในเซิร์ฟเวอร์ ตัวอย่างเช่นหากคอร์ของคุณมีโปรเซสเซอร์ i7 คุณควรติดกับ 7 เธรดเพื่อทำงานการคำนวณ

ในการตอบคำถามของคุณ:

มีข้อได้เปรียบในการทำเช่นนั้นหรือไม่และในสถานการณ์ใดที่จะต้องทำเช่นนั้น?

Michael Borgwart กล่าวว่าคุณไม่ควรทำเช่นนี้เพื่อปรับปรุงความเร็วในการคำนวณ ผมไม่เห็นด้วยเช่นนี้บทความแสดงให้เห็นแบบมัลติเธรดสามารถช่วยให้การตอบสนองเมื่อผู้ใช้จำเป็นต้องเป็นงานที่หนักคอมพิวเตอร์ทำ ในภาษาอังกฤษแบบธรรมดาผู้ใช้จะไม่ต้องรอนานเพื่อให้งานหนักที่ต้องคำนวณเสร็จสมบูรณ์ด้วยการใช้เธรดหลายเธรด

หากคุณต้องการใช้เธรดจำนวนมากฉันขอแนะนำให้ใช้เธรดพูล สิ่งนี้จะลดค่าใช้จ่ายในการสร้างเธรด


คำถามนี้ถามคำถามนี้อย่างไร
ริ้น

1
คำตอบควรอยู่บนข้อดีของตนเอง หากคุณต้องการแสดงความคิดเห็นคุณจะต้องได้รับ 50 คะแนนชื่อเสียงก่อน
ChrisF

1

นี่เป็นคำถามที่ดีและฉันคิดว่านักพัฒนาส่วนใหญ่ที่ทำงานในการพัฒนาโปรแกรมประยุกต์บนเว็บไม่ได้ใช้มัลติเธรดอย่างชัดเจน เหตุผลค่อนข้างชัดเจนเนื่องจากคุณใช้แอปพลิเคชันเซิร์ฟเวอร์เพื่อปรับใช้แอปพลิเคชันของคุณแอปพลิเคชันเซิร์ฟเวอร์จะจัดการเธรดพูลสำหรับการร้องขอขาเข้าภายใน

ถ้าอย่างนั้นทำไมต้องใช้มัลติเธรดอย่างชัดเจน? อะไรคือสิ่งที่นักพัฒนาเว็บแอปพลิเคชั่นต้องเปิดเผยตัวเองเพื่อมัลติเธรด?

เมื่อคุณทำงานกับแอพพลิเคชั่นขนาดใหญ่ที่คุณต้องใช้เซิร์ฟเวอร์หลาย ๆ คำขอพร้อมกันมันเป็นเรื่องยากที่จะให้บริการทุกประเภทของคำขอพร้อมกันเพราะคำขอประเภทใดประเภทหนึ่งอาจทำให้การประมวลผลจำนวนมากซึ่งอาจทำให้ประสิทธิภาพการสมัครของคุณลดลง

ให้ยกตัวอย่างที่เว็บแอปพลิเคชันหลังจากให้บริการคำขอบางประเภทต้องแจ้งผู้ใช้ผ่านอีเมลและ SMS การทำแบบซิงโครนัสกับเธรดการร้องขออาจทำให้ประสิทธิภาพการทำงานของแอปพลิเคชันเว็บของคุณลดลง ดังนั้นที่นี่บทบาทของ mutlithreading มา ในกรณีเช่นนี้ขอแนะนำให้พัฒนาแอปพลิเคชั่นมัลติเธรดแบบสแตนด์อะโลนผ่านเครือข่ายซึ่งรับผิดชอบในการส่งอีเมลและ SMS เท่านั้น


ทำไมคำตอบนี้จึงลดลง
Anurag Sharma
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.