Rumah  >  Artikel  >  Java  >  Analisis kaedah komunikasi berbilang benang Java

Analisis kaedah komunikasi berbilang benang Java

WBOY
WBOYasal
2024-04-12 08:18:01325semak imbas

Di Java, kaedah komunikasi berbilang benang termasuk pembolehubah kongsi, tunggu/beritahu, semaphore dan paip. Pembolehubah yang dikongsi memudahkan pertukaran data tetapi terdedah kepada isu konkurensi tunggu/beritahu menggunakan mekanisme penyegerakan untuk menunggu dan bangun antara utas mengehadkan bilangan utas yang mengakses sumber pada masa yang sama;

Analisis kaedah komunikasi berbilang benang Java

Analisis komunikasi berbilang benang Java

Pengenalan

Multi-threading ialah konsep penting dalam pengaturcaraan serentak, yang membolehkan berbilang tugasan dilaksanakan secara serentak Untuk melaksanakan pertukaran data dalam persekitaran berbilang benang, kita perlu memahami pelbagai kaedah komunikasi. Artikel ini akan melihat secara mendalam kaedah komunikasi berbilang benang biasa di Jawa, termasuk pembolehubah kongsi, tunggu/beritahu, semaphore dan paip.

Pembolehubah dikongsi

Pembolehubah yang dikongsi ialah pembolehubah global yang boleh diakses oleh berbilang urutan. Apabila satu utas mengubah suai pembolehubah yang dikongsi, utas lain boleh melihat perubahan itu. Walau bagaimanapun, pembolehubah yang dikongsi terdedah kepada masalah konkurensi, seperti keadaan kaum dan tingkah laku yang tidak dapat diramalkan.

Kes praktikal:

public class SharedVariableExample {
    private static int sharedCounter = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                sharedCounter++;
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                sharedCounter--;
            }
        });

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.out.println("最终共享计数器:" + sharedCounter);
    }
}

tunggu/beritahu

tunggu/beritahu ialah mekanisme penyegerakan terbina dalam Java. Kaedah wait() akan meletakkan utas semasa ke dalam keadaan menunggu sehingga utas lain memanggil kaedah notify() atau notifyAll() untuk membangunkannya.

Kes praktikal:

public class WaitNotifyExample {
    private static Object lock = new Object();

    private static boolean dataAvailable = false;

    public static void main(String[] args) throws InterruptedException {
        Thread producer = new Thread(() -> {
            synchronized (lock) {
                while (!dataAvailable) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                System.out.println("处理数据...");
            }
        });

        Thread consumer = new Thread(() -> {
            synchronized (lock) {
                dataAvailable = true;
                lock.notify();
            }
        });

        producer.start();
        consumer.start();

        producer.join();
        consumer.join();
    }
}

Semaphore

Semaphore ialah mekanisme penyegerakan yang membenarkan bilangan utas tertentu untuk mengakses sumber pada masa yang sama. Apabila benang memperoleh semaphore, pembilang semaphore dikurangkan apabila ia melepaskan semaphore, pembilang itu dinaikkan.

Kes praktikal:

public class SemaphoreExample {
    private static Semaphore semaphore = new Semaphore(2);

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            try {
                semaphore.acquire();
                System.out.println("线程 1 进入临界区");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release();
            }
        });

        Thread thread2 = new Thread(() -> {
            try {
                semaphore.acquire();
                System.out.println("线程 2 进入临界区");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release();
            }
        });

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();
    }
}

Pipeline

Pipeline ialah struktur data khas yang digunakan untuk komunikasi antara benang. Ia seperti penampan, satu benang boleh menulis data dan satu lagi benang boleh membaca data.

Kes praktikal:

public class PipeExample {
    private static PipedOutputStream pos = new PipedOutputStream();
    private static PipedInputStream pis = new PipedInputStream(pos);

    public static void main(String[] args) throws IOException {
        Thread writer = new Thread(() -> {
            try {
                pos.write("你好,世界!".getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                pos.close();
            }
        });

        Thread reader = new Thread(() -> {
            try {
                byte[] data = new byte[1024];
                int length = pis.read(data);
                System.out.println(new String(data, 0, length));
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                pis.close();
            }
        });

        writer.start();
        reader.start();

        writer.join();
        reader.join();
    }
}

Atas ialah kandungan terperinci Analisis kaedah komunikasi berbilang benang Java. 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