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

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

WBOY
WBOYasal
2023-10-08 10:37:321418semak imbas

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