Rumah  >  Artikel  >  Java  >  Bagaimana untuk melaksanakan komunikasi antara benang dalam fungsi Java concurrency dan multi-threading?

Bagaimana untuk melaksanakan komunikasi antara benang dalam fungsi Java concurrency dan multi-threading?

WBOY
WBOYasal
2024-04-27 12:48:011040semak imbas

Komunikasi benang Java adalah penting dalam konkurensi dan berbilang benang. Terdapat empat kaedah biasa: data kongsi, mekanisme makluman tunggu, baris gilir serentak dan pertukaran. Perkongsian data melibatkan penggunaan pembolehubah atau objek yang dikongsi, mekanisme tunggu-maklum membenarkan utas menunggu keadaan tertentu, baris gilir serentak menyediakan struktur data selamat benang dan penukar membenarkan utas berpasangan bertukar-tukar data apabila bersedia.

Bagaimana untuk melaksanakan komunikasi antara benang dalam fungsi Java concurrency dan multi-threading?

Komunikasi benang Java: Komunikasi antara utas secara serentak dan berbilang benang

Dalam pengaturcaraan serentak di Java, komunikasi benang adalah kunci untuk mencapai kerjasama dan perkongsian sumber. Terdapat pelbagai mekanisme untuk menghantar maklumat antara pelbagai utas dan menyelaraskan tingkah laku mereka. Tutorial ini akan meneroka kaedah biasa komunikasi benang di Jawa dan menggambarkannya dengan contoh praktikal.

1. Berkongsi data

Cara komunikasi rangkaian yang paling mudah ialah berkongsi pembolehubah awam atau objek antara rangkaian. Untuk mencapai matlamat ini, anda boleh menggunakan kata kunci volatile untuk memastikan keterlihatan dan susunan pembolehubah. volatile 关键字来确保变量的可见性和有序性。

// 共享变量
public class SharedData {
    public volatile int value;
}

// 线程 1
public void increment() {
    sharedData.value++;
}

// 线程 2
public void decrement() {
    sharedData.value--;
}

2. 等待-通知机制

使用 Objectwait()notify()

// 生产者-消费者模型
public class WaitNotify {

    private final Queue<Integer> queue;
    private final Object lock = new Object();

    // 生产者线程
    public void produce() {
        synchronized (lock) {
            while (queue.size() >= maxSize) {
                lock.wait();
            }
            queue.add(value);
            lock.notifyAll();
        }
    }

    // 消费者线程
    public void consume() {
        synchronized (lock) {
            while (queue.isEmpty()) {
                lock.wait();
            }
            value = queue.remove();
            lock.notifyAll();
        }
    }
}

2 mekanisme pemberitahuan menunggu

Menggunakan kaedah wait() dan notify() Object, urutan boleh menunggu untuk benang A yang lain memberitahu bahawa syarat tertentu telah dipenuhi. Ini membolehkan benang tidur sebelum peristiwa berlaku, sekali gus mengelakkan penggunaan CPU yang tidak perlu.

// 使用 ConcurrentLinkedQueue
public class ConcurrencyQueue {

    private final ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<>();

    // 生产者线程
    public void produce() {
        queue.add(value);
    }

    // 消费者线程
    public void consume() {
        Integer value = queue.poll();
    }
}

3. Giliran Serentak

Java menyediakan kelas baris gilir serentak seperti ConcurrentHashMap dan ConcurrentLinkedQueue, yang boleh dikongsi dengan selamat antara berbilang urutan. Mereka menggunakan mekanisme penguncian dalaman untuk memastikan operasi yang betul.

// 使用 Exchanger
public class ExchangerExample {

    private final Exchanger<Integer> exchanger = new Exchanger<>();

    // 线程 1
    public void exchange() {
        try {
            Integer value = exchanger.exchange(value); // 交换值
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    // 线程 2
    public void exchange() {
        try {
            Integer value = exchanger.exchange(value);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

4. Penukar

🎜🎜Penukar membenarkan benang berkomunikasi selepas berpasangan. Penukar melepaskan semua utas apabila mereka bersedia untuk bertukar data. 🎜rrreee🎜Melalui mekanisme ini, komunikasi berkesan antara utas boleh dicapai untuk membina aplikasi konkurensi tinggi yang kompleks. Memilih kaedah komunikasi yang paling sesuai bergantung pada keperluan aplikasi khusus dan pertimbangan prestasi. 🎜

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan komunikasi antara benang dalam fungsi Java concurrency dan multi-threading?. 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