Sebagai bahasa pengaturcaraan yang amat sesuai untuk membina aplikasi berbilang benang, Java boleh menggunakan sepenuhnya kelebihan pemproses berbilang teras untuk meningkatkan keselarasan dan kecekapan program. Walau bagaimanapun, semasa pembangunan berbilang benang, isu komunikasi antara benang menjadi cabaran utama. Artikel ini akan memperkenalkan beberapa kaedah biasa untuk menangani masalah komunikasi antara benang.
Pembolehubah dikongsi ialah salah satu cara paling mudah dan paling biasa untuk berkomunikasi antara urutan. Berbilang benang boleh menghantar maklumat dengan mengakses dan mengubah suai pembolehubah yang dikongsi. Walau bagaimanapun, kerana benang dilaksanakan secara selari, keadaan perlumbaan mungkin berlaku. Untuk mengelakkan keadaan perlumbaan, kita perlu menggunakan mutex untuk melindungi akses kepada pembolehubah yang dikongsi. Kunci Mutex boleh dilaksanakan dalam Java menggunakan kata kunci yang disegerakkan atau antara muka Kunci.
Berikut ialah contoh kod yang menggunakan pembolehubah dikongsi untuk komunikasi benang:
public class SharedVariableExample { private int sharedVar = 0; public synchronized void increment() { sharedVar++; } public synchronized int getSharedVar() { return sharedVar; } } public class MyThread extends Thread { private SharedVariableExample example; public MyThread(SharedVariableExample example) { this.example = example; } public void run() { for (int i = 0; i < 10; i++) { example.increment(); } } } public class Main { public static void main(String[] args) { SharedVariableExample example = new SharedVariableExample(); MyThread thread1 = new MyThread(example); MyThread thread2 = new MyThread(example); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("SharedVar: " + example.getSharedVar()); } }
Dalam contoh di atas, dua utas melakukan 10 operasi kenaikan masing-masing pada pembolehubah dikongsi, dan mencetak selepas menunggu semua utas menyelesaikan pelaksanaan melalui gabungan( ) kaedah Nilai pembolehubah yang dikongsi.
Apabila menggunakan pembolehubah yang dikongsi untuk komunikasi antara utas, jika utas perlu menunggu hasil thread lain, kita boleh menggunakan Mekanisme Tunggu/Beritahu. Apabila utas perlu menunggu, ia boleh memanggil kaedah wait() objek untuk meletakkan utas ke dalam keadaan menunggu Apabila syarat tertentu dipenuhi, utas lain memanggil kaedah notify() objek untuk membangunkan utas menunggu.
Berikut ialah kod sampel yang menggunakan mekanisme tunggu/pemberitahuan untuk komunikasi rangkaian:
public class WaitNotifyExample { private boolean flag = false; public synchronized void waitForSignal() { while (!flag) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } flag = false; System.out.println("Received signal"); } public synchronized void sendSignal() { flag = true; notify(); } } public class WaitThread extends Thread { private WaitNotifyExample example; public WaitThread(WaitNotifyExample example) { this.example = example; } public void run() { example.waitForSignal(); } } public class NotifyThread extends Thread { private WaitNotifyExample example; public NotifyThread(WaitNotifyExample example) { this.example = example; } public void run() { example.sendSignal(); } } public class Main { public static void main(String[] args) { WaitNotifyExample example = new WaitNotifyExample(); WaitThread waitThread = new WaitThread(example); NotifyThread notifyThread = new NotifyThread(example); waitThread.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } notifyThread.start(); try { waitThread.join(); notifyThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } }
Dalam contoh di atas, utas WaitThread menunggu isyarat diterima, utas NotifyThread menghantar isyarat dan membangunkan penantian benang selepas menunggu tempoh masa melalui benang kaedah sleep().
Menyekat Baris ialah cara yang cekap untuk mencapai komunikasi antara rangkaian. Ia menyediakan kaedah put() dan take(), yang boleh menyekat dan menunggu secara automatik apabila baris gilir penuh atau kosong sehingga syarat dipenuhi.
Berikut ialah contoh kod menggunakan baris gilir menyekat untuk komunikasi benang:
import java.util.concurrent.ArrayBlockingQueue;
Atas ialah kandungan terperinci Bagaimana untuk menangani isu komunikasi antara benang dalam pembangunan Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!