1. Mengembalikan data melalui variabel dan metode kelas
Menggunakan metode ini untuk mengembalikan data memerlukan pemanggilan metode start sebelum data dapat diperoleh melalui variabel atau metode kelas. Mari kita lihat dulu hasil apa yang kita peroleh dari Contoh 2-13.
Copy kode kodenya sebagai berikut:
paket mitos;
kelas publik MyThread memperluas Thread
{
nilai String pribadi1;
nilai String pribadi2;
menjalankan kekosongan publik()
{
value1 = "Kembalikan data melalui variabel anggota";
value2 = "Kembalikan data melalui metode anggota";
}
public static void main(String[] args) memunculkan Pengecualian
{
Utas MyThread = baru MyThread();
thread.mulai();
System.out.println("nilai1:" + thread.nilai1);
System.out.println("nilai2:" + thread.nilai2);
}
}
Menjalankan kode di atas mungkin menghasilkan hasil sebagai berikut:
Copy kode kodenya sebagai berikut:
nilai1: nol
nilai2:nol
Hasil berjalan di atas terlihat sangat tidak normal. Nilai telah ditetapkan ke nilai1 dan nilai2 dalam metode yang dijalankan, tetapi nol dikembalikan. Alasan mengapa hal ini terjadi adalah karena nilai value1 dan value2 dikeluarkan segera setelah memanggil metode start, dan metode run di sini belum mengeksekusi pernyataan yang menetapkan nilai ke value1 dan value2. Untuk menghindari situasi ini, Anda perlu menunggu hingga metode run dijalankan sebelum mengeksekusi kode yang menghasilkan nilai1 dan nilai2. Oleh karena itu, kita dapat memikirkan untuk menggunakan metode sleep untuk menunda thread utama. Misalnya, kita dapat menambahkan pernyataan berikut setelah thread.start():
tidur(1000);
Melakukan hal ini dapat menyebabkan thread utama menunda eksekusi selama 1 detik sebelum melanjutkan, tetapi ada masalah dengan ini, yaitu bagaimana kita mengetahui berapa lama penundaannya. Dalam contoh ini, hanya ada dua pernyataan penugasan dalam metode run, dan hanya satu thread yang dibuat. Oleh karena itu, penundaan selama 1 detik sudah cukup, tetapi jika pernyataan dalam metode run rumit, kali ini sulit diprediksi. Oleh karena itu, metode ini Tidak stabil.
Tujuan kita adalah mendapatkan nilai value1 dan value2, jadi kita hanya perlu menentukan apakah value1 dan value2 adalah null. Jika tidak satu pun dari keduanya yang nol, kedua nilai ini dapat ditampilkan. Kita dapat menggunakan kode berikut untuk mencapai tujuan ini:
Copy kode kodenya sebagai berikut:
while (utas.nilai1 == null || thread.nilai2 == null);
Menggunakan pernyataan di atas dapat menghindari situasi ini dengan sangat stabil, namun metode ini menghabiskan terlalu banyak sumber daya sistem. Bisa dibayangkan jika kode pada metode run sangat kompleks, nilai1 dan nilai2 akan memakan waktu lama untuk ditetapkan, sehingga perulangan while harus terus dijalankan hingga nilai1 dan nilai2 tidak kosong. Oleh karena itu, kami dapat melakukan perbaikan berikut terhadap pernyataan di atas:
Copy kode kodenya sebagai berikut:
while (utas.nilai1 == null || thread.nilai2 == nol)
tidur(100);
Dalam perulangan while, setelah menilai nilai value1 dan value2 untuk pertama kalinya, ia tidur selama 100 milidetik, lalu menilai kedua nilai tersebut. Ini akan menggunakan lebih sedikit sumber daya sistem.
Meskipun metode di atas dapat diselesaikan dengan sangat baik, model threading Java memberi kita solusi yang lebih baik, yaitu metode join. Seperti yang telah dibahas sebelumnya, fungsi join adalah menggunakan thread untuk mengubah dari eksekusi asinkron ke eksekusi sinkron. Ketika thread dieksekusi secara sinkron, tidak ada bedanya dengan mendapatkan data kembalian dari metode biasa. Oleh karena itu, masalah ini dapat diselesaikan dengan lebih efisien menggunakan kode seperti berikut:
Copy kode kodenya sebagai berikut:
thread.mulai();
thread.join();
Setelah thread.join() dijalankan, metode run dari thread thread telah keluar, yang berarti thread thread telah berakhir. Oleh karena itu, Anda dapat dengan aman menggunakan sumber daya apa pun dari kelas MyThread setelah thread.join() untuk mendapatkan data yang dikembalikan.
2. Mengembalikan data melalui fungsi panggilan balik
Faktanya, metode ini telah diperkenalkan dalam "Tiga Metode Melewati Data ke Thread". Pada contoh artikel “Tiga Metode Melewati Data ke Thread”, hasil perhitungan diteruskan ke thread melalui metode proses kelas Work, tetapi pada saat yang sama, tiga angka acak juga diperoleh dari thread melalui metode proses. Oleh karena itu, metode ini dapat meneruskan data dan memperoleh data dari thread.