JavaRush /Blog Java /Random-VI /Cấp độ 28. Trả lời các câu hỏi phỏng vấn về chủ đề cấp độ...
zor07
Mức độ
Санкт-Петербург

Cấp độ 28. Trả lời các câu hỏi phỏng vấn về chủ đề cấp độ

Xuất bản trong nhóm
Chào mọi người! Tôi quyết định tiếp tục học ở Javarash, mặc dù thực tế là tôi đã tìm được việc làm ở Java. Cấp độ 28. Trả lời câu hỏi phỏng vấn về chủ đề cấp độ - 1Tôi viết blog này cho chính mình, rất lười biếng và có thể nói là dưới áp lực. Tôi sẽ rất vui nếu ai đó thấy nó hữu ích, nhưng bạn không nên sử dụng nó làm nguồn chính để tìm câu trả lời cho các câu hỏi cấp độ.

1. Ưu tiên của chủ đề là gì?

Mỗi luồng trong hệ thống có mức độ ưu tiên riêng. Mức độ ưu tiên là một số trong đối tượng luồng từ 1 đến 10, với giá trị cao hơn biểu thị mức độ ưu tiên cao hơn. Hệ thống thực thi các luồng có mức độ ưu tiên cao hơn trước và các luồng có mức độ ưu tiên thấp hơn chỉ nhận được thời gian CPU khi các luồng tương ứng có đặc quyền hơn của chúng không hoạt động. Bạn có thể làm việc với mức độ ưu tiên của luồng bằng hai hàm:
void setPriority(int priority) //устанавливает приоритет потока.
Các giá trị ưu tiên có thể có là MIN_PRIORITY, NORM_PRIORITY và MAX_PRIORITY.
int getPriority() // получает приоритет потока.
Nguồn Nếu mức độ ưu tiên không được chỉ định thì luồng sẽ nhận được mức độ ưu tiên 5 - trung bình. Mức độ ưu tiên của luồng không ảnh hưởng lớn đến hoạt động của nó mà mang tính chất tư vấn. Nếu có nhiều luồng ngủ cần được khởi động thì máy Java sẽ khởi động luồng có mức độ ưu tiên cao hơn trước. Máy Java quản lý các luồng khi nó thấy phù hợp. Các chủ đề có mức độ ưu tiên thấp sẽ không ở trạng thái rảnh. Đơn giản là họ sẽ nhận được ít thời gian hơn những người khác, nhưng vẫn sẽ bị xử tử. Trong hầu hết các trường hợp, các luồng luôn chạy ở cùng mức độ ưu tiên. Việc cố gắng dành nhiều thời gian hơn cho một luồng so với các luồng khác thường cho thấy lỗi kiến ​​trúc trong chương trình.

2. Có thể dừng một luồng bằng cách giảm mức độ ưu tiên của nó xuống 0 không?

KHÔNG. Sẽ bị némIllegalArgumentException

3. Tại sao cần có lớp ThreadGroup?

Để ngăn bất kỳ luồng nào dừng và làm gián đoạn tất cả các luồng liên tiếp, khái niệm “nhóm luồng” đã được đưa ra. Một thread chỉ có thể ảnh hưởng đến các thread khác cùng nhóm với nó. ThreadGrouplà một lớp quản lý các nhóm chủ đề. Cách tiếp cận này cho phép bạn bảo vệ các luồng khỏi những thay đổi không mong muốn. Đôi khi bạn phải chạy mã mà bạn không thể tin tưởng 100%. Do đó, sẽ thuận tiện hơn khi đặt tất cả các luồng của nó vào một nhóm riêng biệt và ngăn chúng can thiệp vào công việc của nhóm luồng chính. Nói cách khác, để quản lý các nhóm chủ đề

4. Main-thread thuộc nhóm thread nào?

main

5. Mẫu ThreadPool là gì

Nói chung, một mẫu ThreadPoollà một nhóm các luồng giải quyết các nhóm vấn đề. Nhiệm vụ được tổ chức thành một hàng đợi. Khi một luồng hoàn thành công việc trên một tác vụ, nó sẽ yêu cầu tác vụ tiếp theo từ hàng đợi cho đến khi tất cả các tác vụ trong hàng đợi được hoàn thành. Sau đó, luồng có thể kết thúc hoặc chuyển sang chế độ ngủ cho đến khi các tác vụ mới xuất hiện trong hàng đợi.

6. Tại sao chúng ta cần lớp ThreadPoolExecutor?

Để giải quyết một số lượng lớn các vấn đề nhỏ với một nhóm các luồng. Việc sử dụng một lớp sẽ tránh được việc sử dụng lãng phí tài nguyên máy. Bởi vì việc tạo thread riêng cho từng công việc là không hợp lý cho lắm. Máy Java phân bổ khá nhiều tài nguyên cho mỗi luồng. Nói cách khác, việc tạo và hủy một luồng đã sử dụng có thể lãng phí nhiều tài nguyên và thời gian hơn chính tác vụ đó. Các nhà phát triển Java đã đưa ra một giải pháp hay cho vấn đề này - ThreadPoolExecutor. Đây là một lớp có hai thứ bên trong:
  • Hàng đợi nhiệm vụ mà bạn có thể thêm nhiệm vụ khi chúng xuất hiện trong chương trình.
  • Nhóm chủ đề (nhóm chủ đề) - thực hiện các tác vụ này.
Trong trường hợp này, các luồng không bị hủy sau khi hoàn thành nhiệm vụ mà chuyển sang chế độ ngủ. Để bắt đầu hoàn thành một nhiệm vụ mới ngay khi nó xuất hiện.

7. Bạn biết bao nhiêu cách tạo thread? (Chủ đề, có thể chạy được, có thể gọi được )

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. Lớp Future dùng để làm gì?

Đối tượng này có thể được sử dụng để tìm hiểu xem một nhiệm vụ đã hoàn thành hay chưa và cũng để nhận kết quả thực hiện nó. boolean cancel(boolean mayInterrupt); // Останавливает задачу.
boolean isCancelled(); //returns true, если задача была остановлена.
boolean isDone(); //returns true, если выполнение задачи завершено.
V get() throws InterruptedException, ExecutionException; //returns результат вызова метода call or кидает исключение, если оно было.

9. Ưu điểm của Callable so với Runnable là gì?

Sử dụng Callablechúng ta có thể biết tác vụ đã hoàn thành chưa và tìm ra kết quả của nó, dễ dàng hơn nhiều so với sử dụngRunnable

10. Có thể hủy việc thực thi một tác vụ nếu chúng ta sử dụng lớp Future không?

Có thể thực hiện được nếu tác vụ nằm trong hàng đợi và đang chờ thực thi, nếu không thì không phải vậy
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION