JavaRush /จาวาบล็อก /Random-TH /ระดับ 28 คำตอบสำหรับคำถามสัมภาษณ์ในหัวข้อระดับ
zor07
ระดับ
Санкт-Петербург

ระดับ 28 คำตอบสำหรับคำถามสัมภาษณ์ในหัวข้อระดับ

เผยแพร่ในกลุ่ม
สวัสดีทุกคน! ฉันตัดสินใจเรียนต่อที่ Javarash แม้ว่าฉันจะได้งานใน Java แล้วก็ตาม ระดับ 28 คำตอบสำหรับคำถามสัมภาษณ์ในหัวข้อระดับ - 1ฉันเขียนบล็อกนี้เพื่อตัวเองอย่างเกียจคร้านและใครๆ ก็บอกว่าอยู่ภายใต้ความกดดัน ฉันจะดีใจมากถ้ามีคนพบว่ามีประโยชน์ แต่คุณไม่ควรใช้เป็นแหล่งข้อมูลหลักในการหาคำตอบของคำถามระดับ

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

10. เป็นไปได้ไหมที่จะยกเลิกการปฏิบัติงานหากเราใช้คลาส Future?

อาจเป็นไปได้หากงานอยู่ในคิวและรอการดำเนินการ ไม่เช่นนั้นก็ไม่ใช่ข้อเท็จจริง
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION