Dalam model pengembangan sinkron tradisional, saat kita memanggil suatu fungsi, data diteruskan melalui parameter fungsi, dan hasil penghitungan akhir dikembalikan melalui nilai kembalian fungsi tersebut. Namun, dalam mode pengembangan asinkron multi-thread, transmisi dan pengembalian data sangat berbeda dengan mode pengembangan sinkron. Karena jalannya dan akhir thread tidak dapat diprediksi, saat mentransfer dan mengembalikan data, data tidak dapat dikembalikan melalui parameter fungsi dan pernyataan pengembalian seperti fungsi. Artikel ini memperkenalkan beberapa metode untuk meneruskan data ke thread karena alasan di atas. Pada artikel berikutnya, kami akan memperkenalkan metode mengembalikan data dari thread.
Kalau mau ambil dulu, harus dikasih dulu. Umumnya, saat menggunakan thread, diperlukan beberapa data inisialisasi, lalu thread menggunakan data tersebut untuk memproses dan mengembalikan hasilnya. Hal pertama yang harus dilakukan dalam proses ini adalah meneruskan data ke thread.
1. Melewati data melalui metode konstruktor <BR>Saat membuat thread, Anda harus membuat instance kelas Thread atau subkelasnya. Oleh karena itu, tidak sulit bagi kita untuk memikirkan meneruskan data ke dalam thread melalui metode konstruktor kelas thread sebelum memanggil metode start. Dan simpan data yang masuk menggunakan variabel kelas untuk digunakan oleh thread (sebenarnya digunakan dalam metode run). Kode berikut menunjukkan cara meneruskan data melalui konstruktor:
Copy kode kodenya sebagai berikut:
paket mitos;
kelas publik MyThread1 memperluas Thread
{
nama String pribadi;
publik MyThread1 (Nama string)
{
ini.nama = nama;
}
menjalankan kekosongan publik()
{
System.out.println("halo " + nama);
}
public static void main(String[] args)
{
Utas utas = new MyThread1("dunia");
thread.mulai();
}
}
Karena metode ini mentransfer data saat membuat objek thread, data sudah ada sebelum thread berjalan, sehingga data tidak akan diteruskan setelah thread berjalan. Jika Anda ingin meneruskan data yang lebih kompleks, Anda bisa menggunakan struktur data seperti koleksi dan kelas. Meskipun lebih aman menggunakan metode konstruktor untuk mentransfer data, namun akan menimbulkan banyak ketidaknyamanan jika data yang akan ditransfer banyak. Karena Java tidak memiliki parameter default, jika Anda ingin mendapatkan efek yang mirip dengan parameter default, Anda harus menggunakan kelebihan beban. Hal ini tidak hanya membuat konstruktor itu sendiri menjadi terlalu rumit, tetapi juga meningkatkan jumlah konstruktor secara signifikan. Oleh karena itu, untuk menghindari situasi ini, teruskan data melalui metode kelas atau variabel kelas.
2. Melewati data melalui variabel dan metode <BR>Umumnya ada dua peluang untuk meneruskan data ke suatu objek. Peluang pertama adalah meneruskan data melalui metode konstruktor saat membuat objek, dan peluang lainnya adalah mendefinisikan rangkaian data di kelas. Metode atau variabel publik (juga disebut bidang). Kemudian setelah membuat objek, tetapkan nilai satu per satu melalui instance objek. Kode berikut merupakan modifikasi dari kelas MyThread1, menggunakan metode setName untuk mengatur nama variabel:
Copy kode kodenya sebagai berikut:
paket mitos;
kelas publik MyThread2 mengimplementasikan Runnable
{
nama String pribadi;
public void setName(Nama string)
{
ini.nama = nama;
}
menjalankan kekosongan publik()
{
System.out.println("halo " + nama);
}
public static void main(String[] args)
{
Benang Saya2 Benang Saya = Benang Saya2 baru();
myThread.setName("dunia");
Utas utas = Utas baru (Utas Saya);
thread.mulai();
}
}
3. Melewati data melalui fungsi panggilan balik <BR>Dua metode meneruskan data ke thread yang dibahas di atas adalah yang paling umum digunakan. Namun kedua metode secara aktif meneruskan data ke kelas thread dalam metode utama. Untuk thread, data ini diterima secara pasif. Namun, dalam beberapa aplikasi, data perlu diperoleh secara dinamis saat thread sedang berjalan. Misalnya, tiga angka acak dihasilkan dalam metode run dari kode berikut, dan kemudian jumlah dari ketiga angka acak ini dihitung melalui metode proses. dari kelas Work, dan Mengembalikan hasilnya melalui nilai kelas Data. Seperti yang dapat dilihat dari contoh ini, tiga angka acak harus diperoleh sebelum mengembalikan nilai. Dengan kata lain, nilai ini tidak dapat diteruskan ke kelas thread terlebih dahulu.
Copy kode kodenya sebagai berikut:
paket mitos;
data kelas
{
nilai int publik = 0;
}
pekerjaan kelas
{
proses public void (data data, bilangan bulat)
{
untuk (int n : angka)
{
data.nilai += n;
}
}
}
kelas publik MyThread3 memperluas Thread
{
pekerjaan swasta;
publik MyThread3(Pekerjaan kerja)
{
this.pekerjaan = pekerjaan;
}
menjalankan kekosongan publik()
{
java.util.Acak acak = baru java.util.Acak();
Data data = Data baru();
int n1 = acak.nextInt(1000);
int n2 = acak.nextInt(2000);
int n3 = acak.nextInt(3000);
work.process(data, n1, n2, n3); // Gunakan fungsi panggilan balik
Sistem.keluar.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+"
+ String.valueOf(n3) + "=" + data.nilai);
}
public static void main(String[] args)
{
Thread thread = new MyThread3(pekerjaan baru());
thread.mulai();
}
}
Metode proses dalam kode di atas disebut fungsi panggilan balik. Intinya, fungsi panggilan balik adalah fungsi acara. Di Windows API, fungsi panggilan balik sering digunakan untuk berinteraksi dengan data antara program yang memanggil API. Oleh karena itu, proses pemanggilan fungsi panggilan balik adalah proses asli yang memicu peristiwa tersebut. Dalam contoh ini, memanggil metode proses untuk mendapatkan data sama dengan memicu suatu peristiwa dalam metode yang dijalankan.