cari
RumahJavajavaTutorialBagaimana untuk menyelesaikan isu komunikasi antara benang dan perkongsian data di Java

Bagaimana untuk menyelesaikan isu komunikasi antara benang dan perkongsian data di Java

Oct 08, 2023 am 10:37 AM
Komunikasi rangkaian: tunggu dan maklumkanPerkongsian data: kata kunci disegerakkankata kunci yang tidak menentu

Bagaimana untuk menyelesaikan isu komunikasi antara benang dan perkongsian data di Java

Cara menyelesaikan masalah komunikasi antara benang dan perkongsian data dalam Java

Di Java, komunikasi antara benang dan perkongsian data adalah komponen penting untuk mencapai pengaturcaraan berbilang benang. Untuk berbilang rangkaian untuk mengakses data yang dikongsi dengan selamat dan berkomunikasi dengan berkesan, kami perlu menggunakan beberapa mekanisme untuk memastikan ketekalan susunan dan data antara rangkaian. Artikel ini akan memperkenalkan beberapa komunikasi antara utas biasa dan penyelesaian perkongsian data dalam Java dan memberikan contoh kod yang sepadan.

1. Gunakan kata kunci yang disegerakkan untuk melaksanakan komunikasi antara benang dan perkongsian data

  1. Gunakan kaedah yang disegerakkan

Kata kunci yang disegerakkan boleh mengubah suai kaedah supaya hanya satu utas boleh memasuki kaedah untuk pelaksanaan, dan utas lain perlu untuk menunggu. Ini boleh digunakan untuk melaksanakan komunikasi dan perkongsian data antara rangkaian.

Kod sampel:

public class ThreadCommunication {
    private boolean flag = false;

    public synchronized void printNumbers() {
        // 线程A负责打印奇数
        for (int i = 1; i <= 10; i += 2) {
            while (flag) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("ThreadA: " + i);
            flag = true;
            notifyAll();
        }
    }

    public synchronized void printLetters() {
        // 线程B负责打印偶数
        for (char c = 'A'; c <= 'J'; c += 2) {
            while (!flag) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("ThreadB: " + c);
            flag = false;
            notifyAll();
        }
    }

    public static void main(String[] args) {
        final ThreadCommunication communication = new ThreadCommunication();

        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                communication.printNumbers();
            }
        });

        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                communication.printLetters();
            }
        });

        threadA.start();
        threadB.start();
    }
}

Dalam contoh di atas, dengan mengubah suai kaedah printNumbers() dan printLetters() dengan kata kunci yang disegerakkan, ketekalan pesanan dan data yang dikongsi antara utas A dan utas B dipastikan. Gunakan bendera bendera untuk mengawal pelaksanaan ganti dua utas, dan gunakan kaedah wait() dan notifyAll() untuk melaksanakan pengecualian bersama dan komunikasi benang.

  1. Gunakan blok disegerakkan

Kata kunci disegerakkan juga boleh mengubah suai blok kod supaya hanya satu utas boleh memasuki blok kod untuk pelaksanaan, dan utas lain perlu menunggu. Ini boleh digunakan untuk melaksanakan komunikasi dan perkongsian data antara rangkaian.

Contoh kod:

public class ThreadCommunication2 {
    private Object lock = new Object();
    private int number = 0;

    public void printNumbers() {
        synchronized (lock) {
            // 线程A负责打印奇数
            for (int i = 1; i <= 10; i += 2) {
                while (number % 2 == 0) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("ThreadA: " + i);
                number++;
                lock.notifyAll();
            }
        }
    }

    public void printLetters() {
        synchronized (lock) {
            // 线程B负责打印偶数
            for (char c = 'A'; c <= 'J'; c += 2) {
                while (number % 2 != 0) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("ThreadB: " + c);
                number++;
                lock.notifyAll();
            }
        }
    }

    public static void main(String[] args) {
        final ThreadCommunication2 communication = new ThreadCommunication2();

        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                communication.printNumbers();
            }
        });

        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                communication.printLetters();
            }
        });

        threadA.start();
        threadB.start();
    }
}

Dalam contoh di atas, dengan menghias blok kod dengan kata kunci yang disegerakkan, ketekalan susunan dan data yang dikongsi antara utas A dan utas B dipastikan. Gunakan pembolehubah nombor dan objek kunci untuk mengawal pelaksanaan ganti dua utas, dan gunakan kaedah wait() dan notifyAll() untuk melaksanakan pengecualian bersama dan komunikasi benang.

2. Gunakan Lock and Condition untuk merealisasikan komunikasi antara benang dan perkongsian data

  1. Gunakan ReentrantLock and Condition

ReentrantLock ialah kunci mutex reentrant yang disediakan oleh Java, yang boleh digunakan untuk merealisasikan komunikasi antara benang dan perkongsian data . Condition ialah objek keadaan yang disediakan oleh ReentrantLock, yang boleh menyekat dan membangunkan benang melalui kaedah await() dan signalAll().

Kod sampel:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ThreadCommunication3 {
    private Lock lock = new ReentrantLock();
    private Condition numberCondition = lock.newCondition();
    private Condition letterCondition = lock.newCondition();
    private int number = 0;

    public void printNumbers() {
        lock.lock();
        try {
            // 线程A负责打印奇数
            for (int i = 1; i <= 10; i += 2) {
                while (number % 2 == 0) {
                    try {
                        numberCondition.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("ThreadA: " + i);
                number++;
                letterCondition.signalAll();
            }
        } finally {
            lock.unlock();
        }
    }

    public void printLetters() {
        lock.lock();
        try {
            // 线程B负责打印偶数
            for (char c = 'A'; c <= 'J'; c += 2) {
                while (number % 2 != 0) {
                    try {
                        letterCondition.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("ThreadB: " + c);
                number++;
                numberCondition.signalAll();
            }
        } finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) {
        final ThreadCommunication3 communication = new ThreadCommunication3();

        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                communication.printNumbers();
            }
        });

        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                communication.printLetters();
            }
        });

        threadA.start();
        threadB.start();
    }
}

Dalam contoh di atas, ketekalan susunan dan data yang dikongsi antara utas A dan utas B dicapai dengan menggunakan ReentrantLock and Condition. Gunakan pembolehubah nombor, objek kunci dan objek Keadaan untuk mengawal pelaksanaan ganti dua utas, dan sekat dan bangunkan utas melalui kaedah await() dan signalAll().

3 Gunakan kata kunci yang tidak menentu untuk berkongsi data antara utas

Kata kunci yang tidak menentu boleh digunakan untuk mengubah suai pembolehubah untuk memastikan keterlihatan pembolehubah kepada semua utas. Apabila satu utas mengubah suai nilai pembolehubah yang tidak menentu, utas lain akan segera melihat nilai terkini, sekali gus memastikan ketekalan data.

Kod sampel:

public class ThreadCommunication4 {
    private volatile boolean flag = false;

    public void printNumbers() {
        // 线程A负责打印奇数
        for (int i = 1; i <= 10; i += 2) {
            while (flag) {
                // 空循环,等待flag为false
            }
            System.out.println("ThreadA: " + i);
            flag = true;
        }
    }

    public void printLetters() {
        // 线程B负责打印偶数
        for (char c = 'A'; c <= 'J'; c += 2) {
            while (!flag) {
                // 空循环,等待flag为true
            }
            System.out.println("ThreadB: " + c);
            flag = false;
        }
    }

    public static void main(String[] args) {
        final ThreadCommunication4 communication = new ThreadCommunication4();

        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                communication.printNumbers();
            }
        });

        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                communication.printLetters();
            }
        });

        threadA.start();
        threadB.start();
    }
}

Dalam contoh di atas, dengan menggunakan kata kunci yang tidak menentu untuk mengubah suai pembolehubah bendera, ketekalan data yang dikongsi antara utas A dan utas B dicapai. Gunakan pembolehubah bendera untuk mengawal pelaksanaan ganti kedua-dua benang, dan tunggu nilai bendera melalui gelung kosong.

Ringkasan:

Artikel ini memperkenalkan beberapa penyelesaian biasa untuk komunikasi antara benang dan isu perkongsian data di Jawa, termasuk menggunakan kata kunci yang disegerakkan dan Kunci dan Syarat untuk mencapai komunikasi antara benang, dan menggunakan kata kunci yang tidak menentu untuk mencapai perkongsian data. Semua penyelesaian di atas boleh memastikan ketekalan susunan dan data antara berbilang rangkaian penyelesaian yang mana untuk dipilih bergantung pada keperluan dan senario tertentu. Dalam pengaturcaraan berbilang benang sebenar, adalah perlu untuk memilih penyelesaian yang sesuai mengikut situasi khusus untuk menyelesaikan masalah komunikasi antara benang dan perkongsian data, untuk memastikan ketepatan dan prestasi program.

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan isu komunikasi antara benang dan perkongsian data di 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
Bagaimanakah saya menggunakan Maven atau Gradle untuk Pengurusan Projek Java Lanjutan, Membina Automasi, dan Resolusi Ketergantungan?Bagaimanakah saya menggunakan Maven atau Gradle untuk Pengurusan Projek Java Lanjutan, Membina Automasi, dan Resolusi Ketergantungan?Mar 17, 2025 pm 05:46 PM

Artikel ini membincangkan menggunakan Maven dan Gradle untuk Pengurusan Projek Java, membina automasi, dan resolusi pergantungan, membandingkan pendekatan dan strategi pengoptimuman mereka.

Bagaimanakah saya membuat dan menggunakan perpustakaan Java Custom (fail JAR) dengan pengurusan versi dan pergantungan yang betul?Bagaimanakah saya membuat dan menggunakan perpustakaan Java Custom (fail JAR) dengan pengurusan versi dan pergantungan yang betul?Mar 17, 2025 pm 05:45 PM

Artikel ini membincangkan membuat dan menggunakan perpustakaan Java tersuai (fail balang) dengan pengurusan versi dan pergantungan yang betul, menggunakan alat seperti Maven dan Gradle.

Bagaimanakah saya melaksanakan caching pelbagai peringkat dalam aplikasi java menggunakan perpustakaan seperti kafein atau cache jambu?Bagaimanakah saya melaksanakan caching pelbagai peringkat dalam aplikasi java menggunakan perpustakaan seperti kafein atau cache jambu?Mar 17, 2025 pm 05:44 PM

Artikel ini membincangkan pelaksanaan caching pelbagai peringkat di Java menggunakan kafein dan cache jambu untuk meningkatkan prestasi aplikasi. Ia meliputi persediaan, integrasi, dan faedah prestasi, bersama -sama dengan Pengurusan Dasar Konfigurasi dan Pengusiran PRA Terbaik

Bagaimanakah saya boleh menggunakan JPA (Java Constence API) untuk pemetaan objek-objek dengan ciri-ciri canggih seperti caching dan malas malas?Bagaimanakah saya boleh menggunakan JPA (Java Constence API) untuk pemetaan objek-objek dengan ciri-ciri canggih seperti caching dan malas malas?Mar 17, 2025 pm 05:43 PM

Artikel ini membincangkan menggunakan JPA untuk pemetaan objek-relasi dengan ciri-ciri canggih seperti caching dan pemuatan malas. Ia meliputi persediaan, pemetaan entiti, dan amalan terbaik untuk mengoptimumkan prestasi sambil menonjolkan potensi perangkap. [159 aksara]

Bagaimanakah mekanisme kelas muatan Java berfungsi, termasuk kelas yang berbeza dan model delegasi mereka?Bagaimanakah mekanisme kelas muatan Java berfungsi, termasuk kelas yang berbeza dan model delegasi mereka?Mar 17, 2025 pm 05:35 PM

Kelas kelas Java melibatkan pemuatan, menghubungkan, dan memulakan kelas menggunakan sistem hierarki dengan bootstrap, lanjutan, dan pemuat kelas aplikasi. Model delegasi induk memastikan kelas teras dimuatkan dahulu, yang mempengaruhi LOA kelas tersuai

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Persekitaran pembangunan bersepadu PHP yang berkuasa

PhpStorm versi Mac

PhpStorm versi Mac

Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft