Dalam kode ini, apa arti keduanya bergabung dan pecah? t1.join()
menyebabkan t2
berhenti sampai t1
berakhir?
Thread t1 = new Thread(new EventThread("e1"));
t1.start();
Thread t2 = new Thread(new EventThread("e2"));
t2.start();
while (true) {
try {
t1.join();
t2.join();
break;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
java
multithreading
user697911
sumber
sumber
while(true)
memanggiljoin
metode.Jawaban:
Mengutip dari
Thread.join()
metode javadocs :Ada utas yang menjalankan kode contoh Anda yang mungkin merupakan utas utama .
t1
dant2
utas. Kedua utas mulai berjalan secara paralel.t1.join()
untuk menunggut1
utas selesai.t1
benang selesai dant1.join()
kembali metode di thread utama. Catatan yangt1
sudah bisa diselesaikan sebelumjoin()
panggilan dibuat dalam haljoin()
panggilan akan segera kembali.t2.join()
untuk menunggut2
utas selesai.t2
Rampungkan benang (atau mungkin telah selesai sebelumt1
benang lakukan) dant2.join()
metode kembali di thread utama.Penting untuk memahami bahwa
t1
dant2
utas telah berjalan secara paralel tetapi utas utama yang memulai harus menunggu sampai selesai sebelum utas dapat berlanjut. Itu pola umum. Juga,t1
dan / ataut2
bisa selesai sebelum utas utama memanggiljoin()
mereka. Jika demikian makajoin()
tidak akan menunggu tetapi akan segera kembali.Tidak. Utas utama yang memanggil
t1.join()
akan berhenti berjalan dan menunggut1
utas selesai. Thet2
benang berjalan secara paralel dan tidak terpengaruh oleht1
ataut1.join()
panggilan sama sekali.Dalam hal coba / tangkap,
join()
lemparanInterruptedException
berarti bahwa utas utama yang memanggiljoin()
sendiri dapat terganggu oleh utas lainnya.Bergabung dalam satu
while
lingkaran adalah pola yang aneh. Biasanya Anda akan melakukan gabungan pertama dan kemudian gabungan kedua menangani denganInterruptedException
tepat dalam setiap kasus. Tidak perlu menempatkan mereka dalam satu lingkaran.sumber
t1
dant2
dapat berjalan secara paralel. Hanya sajamain
kebutuhan mereka berdua untuk selesai sebelum itu bisa berlanjut. Itu adalah pola khas @ user697911.while
loop di sana karena (saya kira) itu ingin mencoba kembalijoin()
panggilan jika salah satu terganggu? Saya pasti tidak akan menulis seperti itu di @ user697911.t1
dant2
selesai. Yaitu. jikat1
melemparInterruptedException
, itu akan berulang dan menunggut2
. Alternatifnya adalah menunggu kedua utas di setiap Try-Catch mereka, sehingga perulangan dapat dihindari. Juga, tergantung padaEventThread
, masuk akal untuk melakukannya dengan cara ini, karena kami menjalankan 2 utas, bukan satu.Ini adalah pertanyaan wawancara Jawa favorit .
t1.join()
berarti, t1 mengatakan sesuatu seperti " Saya ingin menyelesaikan dulu ". Sama halnya dengant2
. Tidak peduli siapa yang memulait1
ataut2
utas (dalam hal inimain
metode), utama akan menunggu sampait1
dant2
menyelesaikan tugas mereka.Namun, poin penting untuk mencatat,
t1
dant2
diri mereka sendiri dapat dijalankan secara paralel terlepas dari bergabung urutan panggilan padat1
dant2
. Ini adalahmain/daemon
benang yang harus menunggu .sumber
t1.join(); t2.join();
tidak akan mengizinkan utas yang mengeksekusi gabungan terus sampai kedua utas telah berakhir. Dengan tidak adanya kode yang sangat tidak biasa di tempat lain, urutan bergabung tidak menjadi masalah.join()
berarti menunggu utas selesai. Ini adalah metode pemblokir. Utas utama Anda (yang menjalankanjoin()
) akan menunggu dit1.join()
telepon sampait1
selesai, dan kemudian akan melakukan hal yang samat2.join()
.sumber
Sebuah gambar bernilai ribuan kata.
Semoga bermanfaat, untuk lebih detail klik di sini
sumber
Ketika utas tA memanggil tB.join (), penyebabnya tidak hanya menunggu tB untuk mati atau tA terputus, tetapi juga membuat hubungan sebelum-kejadian antara pernyataan terakhir di tB dan pernyataan berikutnya setelah tB.join () di utas tA.
Itu berarti program
Selalu cetak
Tapi program
Dapat mencetak tidak hanya
Tapi
Selalu hanya '0'.
Karena Java Memory Model tidak memerlukan 'mentransfer' nilai baru 'sharedVar' dari threadB ke utas tanpa heppens-sebelum relasi (permulaan thread, penggabungan thread, penggunaan kata kunci 'synchonized', penggunaan variabel AtomicXXX, dll).
sumber
Sederhananya:
t1.join()
pengembalian setelaht1
selesai.Itu tidak melakukan apa pun untuk utas
t1
, kecuali menunggu sampai selesai.Secara alami, kode berikut
t1.join()
akan dieksekusi hanya setelaht1.join()
pengembalian.sumber
Dari halaman dokumentasi oracle pada Bergabung
Jika t1 adalah
Thread
objek yang utangnya sedang dieksekusi,Jika t2 adalah
Thread
objek yang utangnya sedang dieksekusi,join
API adalah API level rendah, yang telah diperkenalkan di versi java sebelumnya. Banyak hal telah diubah selama periode waktu tertentu (terutama dengan rilis jdk 1.5) di depan concurrency.Anda dapat mencapai hal yang sama dengan java.util.concurrent API. Beberapa contohnya adalah
ExecutorService
Executors
(sejak java 8)Lihat pertanyaan SE terkait:
tunggu sampai semua utas menyelesaikan pekerjaan mereka di java
sumber
Bagi saya, perilaku Join () selalu membingungkan karena saya mencoba mengingat siapa yang akan menunggu siapa. Jangan mencoba mengingatnya seperti itu.
Kita semua tahu bahwa, ketika kita memanggil wait () pada objek apa pun (t1), objek panggilan (utama) dikirim ke ruang tunggu (status Blocked).
Di sini, utas utama adalah panggilan bergabung () yang menunggu () di bawah selimut. Jadi utas utama akan menunggu sampai diberitahukan. Pemberitahuan diberikan oleh t1 ketika selesai dijalankan (utas selesai).
Setelah menerima notifikasi, main keluar dari ruang tunggu dan melanjutkan eksekusi.
sumber
Semoga ini bisa membantu!
sumber
katakanlah utas utama kami memulai utas t1 dan t2. Sekarang, ketika t1.join () dipanggil, utas utama menangguhkan dirinya sendiri hingga utas t1 mati dan kemudian melanjutkan kembali. Demikian pula, ketika t2.join () dijalankan, utas utama ditangguhkan lagi sampai utas t2 mati dan kemudian dilanjutkan.
Jadi, ini cara kerjanya.
Juga, loop sementara tidak benar-benar diperlukan di sini.
sumber