สวัสดีทุกคน! ฉันตัดสินใจเรียนต่อที่ Javarash แม้ว่าฉันจะได้งานใน Java แล้วก็ตาม ฉันเขียนบล็อกนี้เพื่อตัวเองอย่างเกียจคร้านและใครๆ ก็บอกว่าอยู่ภายใต้ความกดดัน ฉันจะดีใจมากถ้ามีคนพบว่ามีประโยชน์ แต่คุณไม่ควรใช้เป็นแหล่งข้อมูลหลักในการหาคำตอบของคำถามระดับ
7. คุณรู้วิธีสร้างกระทู้มีกี่วิธี? (เธรด, รันได้, โทรได้
1. ลำดับความสำคัญของเธรดคืออะไร?
แต่ละเธรดในระบบมีลำดับความสำคัญของตัวเอง ลำดับความสำคัญคือตัวเลขบางตัวในอ็อบเจ็กต์เธรดตั้งแต่ 1 ถึง 10 โดยค่าที่สูงกว่าบ่งบอกถึงลำดับความสำคัญที่สูงกว่า ระบบจะดำเนินการเธรดที่มีลำดับความสำคัญสูงกว่าก่อน และเธรดที่มีลำดับความสำคัญต่ำกว่าจะได้รับเวลา CPU เฉพาะเมื่อเธรดที่มีสิทธิพิเศษมากกว่าไม่ได้ใช้งาน คุณสามารถทำงานกับลำดับความสำคัญของเธรดได้โดยใช้สองฟังก์ชัน:void setPriority(int priority) //устанавливает приоритет потока.
ค่าลำดับความสำคัญที่เป็นไปได้คือ MIN_PRIORITY, NORM_PRIORITY และ MAX_PRIORITY
int getPriority() // получает приоритет потока.
แหล่งที่มา หากไม่ได้ระบุลำดับความสำคัญ เธรดจะได้รับลำดับความสำคัญ 5 - ปานกลาง ลำดับความสำคัญของเธรดไม่ส่งผลกระทบอย่างมากต่อการทำงานของเธรด แต่มีลักษณะเป็นคำแนะนำมากกว่า หากมีหลายเธรดที่นอนหลับซึ่งจำเป็นต้องเริ่มต้น เครื่อง Java จะสตาร์ทเธรดด้วยลำดับความสำคัญที่สูงกว่าก่อน เครื่อง Java จัดการเธรดตามที่เห็นสมควร เธรดที่มีลำดับความสำคัญต่ำจะไม่ถูกใช้งาน พวกเขาจะได้รับเวลาน้อยกว่าคนอื่นๆ แต่จะยังคงถูกประหารชีวิต ในกรณีส่วนใหญ่ เธรดจะทำงานด้วยลำดับความสำคัญเท่ากันเสมอ การพยายามให้เวลาเธรดหนึ่งนานกว่าเธรดอื่นๆ มักจะบ่งชี้ถึงข้อผิดพลาดทางสถาปัตยกรรมในโปรแกรม
2. เป็นไปได้ไหมที่จะหยุดเธรดโดยลดลำดับความสำคัญให้เป็น 0?
เลขที่ จะถูกโยนทิ้งIllegalArgumentException
3. เหตุใดจึงต้องมีคลาส ThreadGroup
เพื่อป้องกันไม่ให้เธรดใด ๆ หยุดและขัดจังหวะเธรดทั้งหมดในแถว แนวคิดของ "กลุ่มของเธรด" จึงถูกนำมาใช้ เธรดสามารถส่งผลต่อเธรดอื่นที่อยู่ในกลุ่มเดียวกันเท่านั้นThreadGroup
เป็นคลาสที่จัดการกลุ่มของเธรด วิธีการนี้ช่วยให้คุณสามารถปกป้องเธรดจากการเปลี่ยนแปลงที่ไม่ต้องการได้ บางครั้งคุณต้องเรียกใช้โค้ดที่คุณไม่สามารถเชื่อถือได้ 100% ดังนั้นจึงสะดวกในการวางเธรดทั้งหมดในกลุ่มแยกต่างหากและป้องกันไม่ให้รบกวนการทำงานของเธรดกลุ่มหลัก กล่าวอีกนัยหนึ่งคือเพื่อจัดการกลุ่มของเธรด
4. main-thread อยู่ในกลุ่มเธรดใด?
main
5. รูปแบบ ThreadPool คืออะไร
โดยทั่วไป รูปแบบThreadPool
คือกลุ่มของเธรดที่แก้ปัญหากลุ่มต่างๆ งานจะถูกจัดระเบียบเป็นคิว เมื่อเธรดทำงานเสร็จ เธรดจะร้องของานถัดไปจากคิวจนกว่างานทั้งหมดในคิวจะเสร็จสมบูรณ์ หลังจากนี้ เธรดสามารถยุติหรือเข้าสู่โหมดสลีปจนกว่างานใหม่จะปรากฏในคิว
6. เหตุใดเราจึงต้องมีคลาส ThreadPoolExecutor
เพื่อแก้ไขปัญหาเล็กๆ น้อยๆ จำนวนมากด้วยกลุ่มเธรด การใช้คลาสจะหลีกเลี่ยงการใช้ทรัพยากรเครื่องจักรอย่างสิ้นเปลือง เพราะการสร้างกระทู้ของตัวเองสำหรับแต่ละงานนั้นไม่สมเหตุสมผลนัก เครื่อง Java จัดสรรทรัพยากรค่อนข้างมากสำหรับแต่ละเธรด กล่าวอีกนัยหนึ่ง การสร้างและทำลายเธรดที่ใช้แล้วอาจทำให้สิ้นเปลืองทรัพยากรและเวลามากกว่าตัวงานเอง นักพัฒนา Java ได้คิดค้นวิธีแก้ปัญหาที่หรูหราสำหรับปัญหานี้ -ThreadPoolExecutor
. นี่คือคลาสที่มีสองสิ่งอยู่ข้างใน:
- คิวงานที่คุณสามารถเพิ่มงานตามที่ปรากฏในโปรแกรมได้
- กลุ่มเธรด (กลุ่มเธรด) – ซึ่งทำหน้าที่เหล่านี้
7. คุณรู้วิธีสร้างกระทู้มีกี่วิธี? (เธรด, รันได้, โทรได้
)
public class ThreadsTests {
//Способ 1
static class ThreadExampleRunnable implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
//Способ 2
static class ThreadExampleFromThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
//Способ 3
static class ThreadExampleFromCallable implements Callable{
@Override
public String call() throws Exception {
return Thread.currentThread().getName();
}
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
new Thread(new ThreadExampleRunnable()).start(); //Способ 1
new ThreadExampleFromThread().start(); //Способ 2
//Способ 3
ExecutorService service = Executors.newFixedThreadPool(5);
Future task = service.submit(new ThreadExampleFromCallable());
System.out.println(task.get());
}
}
8. คลาส Future ใช้ทำอะไร?
ออบเจ็กต์นี้สามารถใช้เพื่อค้นหาว่างานเสร็จสมบูรณ์แล้วหรือไม่ และยังสามารถรับผลลัพธ์ของการดำเนินการได้อีกด้วยboolean cancel(boolean mayInterrupt); // Останавливает задачу.
boolean isCancelled(); //returns true, если задача была остановлена.
boolean isDone(); //returns true, если выполнение задачи завершено.
V get() throws InterruptedException, ExecutionException; //returns результат вызова метода call or кидает исключение, если оно было.
9. Callable มีข้อดีมากกว่า Runnable อย่างไร?
การใช้ช่วยCallable
ให้เราทราบว่างานเสร็จสิ้นแล้วหรือไม่และค้นหาผลลัพธ์ได้ง่ายกว่าการใช้มากRunnable
GO TO FULL VERSION