Cara Berkongsi Data Antara Dua Kelas SwingWorker di Java
Pengenalan
Apabila bekerja dengan berbilang benang dalam aplikasi Java, kadangkala menjadi perlu untuk berkongsi data antara mereka. Kelas SwingWorker, yang memanjangkan SwingUtilities, menyediakan cara yang mudah untuk melaksanakan tugas yang memakan masa dalam urutan yang berasingan, tanpa menyekat urutan penghantaran acara utama.
Pernyataan Masalah
Pertimbangkan senario di mana anda mempunyai dua kelas SwingWorker, FileLineCounterThread dan FileDivisionThread, masing-masing bertanggungjawab untuk melaksanakan tugas yang berbeza. Katakan anda ingin menghantar hasil daripada FileLineCounterThread ke FileDivisionThread.
Penyelesaian
Perkongsian data antara kelas SwingWorker melibatkan dua langkah:
Berkomunikasi dari utas latar belakang ke utas EDT:
Mendengar perubahan harta dalam urutan EDT:
Sampel Pelaksanaan
Coretan kod berikut menunjukkan cara melaksanakan langkah di atas:
import javax.swing.SwingWorker; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; public class DataSharingSwingWorker { public static void main(String[] args) { // Create the SwingWorker instances SwingWorker<Integer, Void> lineCounterWorker = new LineCounterWorker(); SwingWorker<String, Void> divisionWorker = new DivisionWorker(); // Add a listener to the line counter worker lineCounterWorker.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if ("result".equals(evt.getPropertyName())) { // Retrieve the line count from the event int lineCount = (int) evt.getNewValue(); // Pass the line count to the division worker divisionWorker.passData(lineCount); } } }); // Execute the workers lineCounterWorker.execute(); divisionWorker.execute(); } private static class LineCounterWorker extends SwingWorker<Integer, Void> { @Override protected Integer doInBackground() throws Exception { // Perform line counting return null; // Placeholder for line count } @Override protected void done() { firePropertyChange("result", null, get()); } } private static class DivisionWorker extends SwingWorker<String, Void> { private int lineCount; public void passData(int lineCount) { this.lineCount = lineCount; } @Override protected String doInBackground() throws Exception { // Perform division operation based on the line count return null; // Placeholder for division result } @Override protected void done() { System.out.println("Division result: " + get()); } } }
Kesimpulan
Dengan memanfaatkan mekanisme PropertyChangeListener, kelas SwingWorker boleh berkongsi data dengan berkesan antara benang selari, membolehkan lebih fleksibiliti dan kawalan dalam aplikasi berbilang benang yang kompleks.
Atas ialah kandungan terperinci Bagaimana untuk Berkongsi Data Antara Dua Kelas SwingWorker di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!