Rumah  >  Artikel  >  Java  >  Penjelasan terperinci tentang prinsip kerja Java Queue dan senario yang berkenaan

Penjelasan terperinci tentang prinsip kerja Java Queue dan senario yang berkenaan

王林
王林asal
2024-01-13 11:07:051308semak imbas

Java Queue队列的实现原理与应用场景

Prinsip pelaksanaan dan senario aplikasi Java Queue

1 Pengenalan

Dalam pembangunan perisian, baris gilir ialah struktur data biasa Ia memasukkan dan memasukkan elemen mengikut prinsip masuk dahulu (FIFO). operasi padam. Java menyediakan antara muka Queue, yang mentakrifkan operasi asas baris gilir, seperti memasuki baris gilir, nyah gilir, dan mendapatkan elemen pertama baris gilir.

Artikel ini akan memperkenalkan prinsip pelaksanaan Java Queue dan senario aplikasinya, dan memberikan contoh kod khusus.

2. Prinsip Pelaksanaan

Kelas pelaksanaan antara muka Java Queue biasanya berbentuk tatasusunan atau senarai terpaut. Dua prinsip pelaksanaan diperkenalkan di bawah:

  1. Prinsip pelaksanaan tatasusunan

Tatasusunan ialah struktur linear, dan elemen boleh diakses melalui subskrip. Untuk pelaksanaan antara muka Baris Gilir, anda boleh menggunakan kaedah tatasusunan bulat, iaitu, mentakrifkan dua penunjuk di kepala dan ekor tatasusunan untuk menunjuk ke kepala dan ekor baris gilir masing-masing. Semasa operasi beratur, elemen pertama dimasukkan ke dalam ekor dan penunjuk ekor digerakkan ke belakang Apabila operasi nyah gilir dilakukan, elemen kepala mula-mula dikeluarkan dan penunjuk kepala digerakkan ke belakang.

Pelaksanaan kaedah ini adalah mudah dan cekap, tetapi pengembangan tatasusunan perlu dipertimbangkan Apabila bilangan elemen dalam baris gilir melebihi panjang tatasusunan, tatasusunan yang lebih besar perlu dibuat dan unsur-unsur bagi. tatasusunan asal disalin ke tatasusunan baharu.

  1. Prinsip pelaksanaan senarai terpaut

Senarai terpaut ialah struktur data yang terdiri daripada nod Setiap nod mengandungi elemen data dan penunjuk ke nod seterusnya. Untuk pelaksanaan antara muka Baris Gilir, anda boleh menggunakan senarai terpaut berganda, iaitu setiap nod dalam senarai terpaut mengandungi penunjuk ke nod sebelumnya dan nod seterusnya.

Apabila membuat baris gilir, anda perlu mencipta nod baharu dan memasukkannya pada penghujung senarai terpaut Apabila menyah gilir, anda perlu mencari nod kepala senarai terpaut dan memadamkannya.

Pelaksanaan senarai terpaut adalah lebih fleksibel daripada pelaksanaan tatasusunan Ia boleh menambah atau mengurangkan nod secara dinamik tanpa mengambil kira isu pengembangan tatasusunan. Walau bagaimanapun, senarai terpaut memerlukan ruang tambahan untuk menyimpan penunjuk dan menduduki ruang memori yang agak besar. Senario Aplikasi pemotongan lalu lintas dan senario lain. Pengeluar menghantar mesej ke baris gilir, dan pengguna mengambil mesej dari baris gilir dan memprosesnya. Ciri masuk dahulu keluar dahulu bagi baris gilir memastikan mesej diproses mengikut susunan ia dihantar.

Kod contoh:

import java.util.Queue;
import java.util.LinkedList;

public class MessageQueue {
    private Queue<String> queue;

    public MessageQueue() {
        this.queue = new LinkedList<>();
    }

    public void enqueue(String message) {
        queue.add(message);
    }

    public String dequeue() {
        return queue.poll();
    }

    public boolean isEmpty() {
        return queue.isEmpty();
    }

    public int size() {
        return queue.size();
    }

    public String peek() {
        return queue.peek();
    }
}

Baris gilir tugas kumpulan benang
  1. Kolam benang digunakan untuk menguruskan pelaksanaan berbilang benang Apabila benang dalam kumpulan benang tidak melahu, tugasan baharu boleh dimasukkan ke dalam baris gilir tugasan tunggu pelaksanaan. Melalui ciri-ciri baris gilir, ia dipastikan bahawa utas dilaksanakan mengikut susunan tugasan diserahkan, yang meningkatkan kebolehkawalan tugas.

Kod sampel:

import java.util.Queue;
import java.util.LinkedList;

public class ThreadPool {
    private Queue<Runnable> queue;

    public ThreadPool() {
        this.queue = new LinkedList<>();
    }

    public void addTask(Runnable task) {
        queue.add(task);
    }

    public void execute() {
        while (!queue.isEmpty()) {
            Runnable task = queue.poll();
            new Thread(task).start();
        }
    }
}

Breadth First Search Algorithm (BFS)
  1. Algoritma BFS biasanya digunakan dalam senario seperti traversal graf dan carian laluan terpendek. Dalam algoritma BFS, baris gilir perlu digunakan sebagai struktur data tambahan, dan nod yang dilalui ditambah pada baris gilir mengikut turutan dan dilalui dalam urutan masuk dahulu, keluar dahulu.

Kod contoh:

import java.util.Queue;
import java.util.LinkedList;

public class BFS {
    public void bfs(Node start) {
        Queue<Node> queue = new LinkedList<>();
        queue.add(start);

        while (!queue.isEmpty()) {
            Node node = queue.poll();
            System.out.println(node.value);

            for (Node neighbor : node.neighbors) {
                if (!neighbor.visited) {
                    neighbor.visited = true;
                    queue.add(neighbor);
                }
            }
        }
    }
}

IV Ringkasan

    Artikel ini memperkenalkan prinsip pelaksanaan Java Queue dan beberapa senario aplikasi biasa, dan memberikan contoh kod khusus. Sebagai struktur data yang biasa digunakan, baris gilir memainkan peranan penting dalam pembangunan perisian Dengan menggunakan baris gilir dengan sewajarnya, kecekapan dan kebolehselenggaraan program boleh dipertingkatkan.
  1. Dengan mempelajari tentang Queue, kami dapat memahami dengan lebih baik prinsip asas struktur data dan algoritma, dan menerapkannya pada senario yang sesuai dalam pembangunan sebenar. Saya harap pembaca dapat memahami dengan lebih mendalam tentang Java Queue melalui artikel ini.

Atas ialah kandungan terperinci Penjelasan terperinci tentang prinsip kerja Java Queue dan senario yang berkenaan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn