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

Analisis kaedah komunikasi berbilang benang Java

WBOY
Lepaskan: 2024-04-12 08:18:01
asal
379 orang telah melayarinya

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);
    }
}
Salin selepas log masuk

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();
    }
}
Salin selepas log masuk

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();
    }
}
Salin selepas log masuk

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();
    }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Analisis kaedah komunikasi berbilang benang Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan