Katakanlah kita memiliki dua Runnables ini:
class R1 implements Runnable {
public void run() { … }
…
}
class R2 implements Runnable {
public void run() { … }
…
}
Lalu apa perbedaan antara ini:
public static void main() {
R1 r1 = new R1();
R2 r2 = new R2();
r1.run();
r2.run();
}
Dan ini:
public static void main() {
R1 r1 = new R1();
R2 r2 = new R2();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
java
multithreading
concurrency
runnable
Ori Popowski
sumber
sumber
start()
, yang memanggil metode natvie, yang harus membuat hal-hal terkait os thread terjadi.start()
sumber metode ada di sini .Jika Anda baru saja memohon
run()
secara langsung, ini dijalankan pada utas panggilan, sama seperti pemanggilan metode lainnya.Thread.start()
diperlukan untuk benar-benar membuat utas baru sehingga metode runnablerun
dijalankan secara paralel.sumber
Thread.start()
doa membuat status utas pindah dari status baru ke status Runnable . Runnable tidak berarti utas berjalan. Setelah utas asli diinisialisasi, utas asli memanggilrun()
metode dalam utas Java, yang membuat status utas berubah dari Runnable ke Running . Ketika utas mengakhiri semua sumber daya, utas asli dan Java dilepaskan.Perbedaannya adalah bahwa
Thread.start()
memulai sebuah utas yang memanggilrun()
metode, sementaraRunnable.run()
hanya memanggilrun()
metode pada utas saat ini.sumber
The perbedaan adalah bahwa ketika program memanggil
start()
metode, baru benang dibuat dan kode di dalamrun()
dilaksanakan di baru benang sedangkan jika Anda memanggilrun()
metode langsung ada baru benang akan dibuat dan kode di dalamrun()
akan mengeksekusi di thread saat ini secara langsung.Perbedaan lain antara
start()
danrun()
di utas Java adalah bahwa Anda tidak dapat meneleponstart()
dua kali. Setelah dimulai,start()
panggilan kedua akan melemparIllegalStateException
ke Java sementara Anda dapat memanggilrun()
metode beberapa kali karena ini hanya metode biasa .sumber
Sebenarnya
Thread.start()
membuat utas baru dan memiliki skenario eksekusi sendiri.Thread.start()
memanggilrun()
metode secara tidak sinkron, yang mengubah status Thread baru menjadi Runnable.Tetapi
Thread.run()
tidak membuat utas baru. Sebaliknya itu menjalankan metode menjalankan di utas berjalan saat ini secara serempak.Jika Anda menggunakan
Thread.run()
maka Anda tidak menggunakan fitur multi threading sama sekali.sumber
invoke
run()
mengeksekusi di utas panggilan, seperti metode lainnya. sedangkanThread.start()
membuat utas baru. memohonrun()
adalah bug terprogram.sumber
Jika Anda melakukannya
run()
di metode utama, utas metode utama akan memanggilrun
metode alih-alih utas yang harus Anda jalankan.The
start()
Metode menciptakan thread baru dan dimanarun()
metode harus dilakukansumber
main
penulis berarti metode panggilan. Jawabannya cukup bagus. +1 ;-)t.start()
adalah metode yang disediakan perpustakaan untuk kode Anda untuk dipanggil saat Anda ingin utas baru.r.run()
adalah metode yang Anda berikan untuk perpustakaan untuk memanggil di thread baru.Sebagian besar jawaban ini melewatkan gambaran besar, yaitu, sejauh menyangkut bahasa Jawa, tidak ada lagi perbedaan di antara
t.start()
dan dir.run()
antara kedua metode lainnya.Keduanya hanya metode. Mereka berdua berlari di utas yang memanggil mereka . Mereka berdua melakukan apa pun yang harus mereka lakukan, dan kemudian mereka berdua kembali, masih di utas yang sama, ke penelepon mereka.
Perbedaan terbesar adalah bahwa sebagian besar kode untuk
t.start()
adalah kode asli sementara, dalam banyak kasus, kode untukr.run()
akan menjadi Java murni. Tapi itu tidak banyak perbedaan. Kode adalah kode. Kode asli lebih sulit ditemukan, dan lebih sulit untuk dipahami ketika Anda menemukannya, tetapi itu hanya kode yang memberi tahu komputer apa yang harus dilakukan.Jadi, apa fungsinya
t.start()
?Ini menciptakan utas asli baru, mengatur agar utas untuk memanggil
t.run()
, dan kemudian memberitahu OS untuk membiarkan utas baru berjalan. Lalu ia kembali.Dan apa fungsinya
r.run()
?Lucunya, orang yang menanyakan pertanyaan ini adalah orang yang menulisnya .
r.run()
melakukan apa pun yang Anda (yaitu, pengembang yang menulisnya) dirancang untuk melakukannya.sumber
Thread.start()
kode mendaftar Thread dengan scheduler dan scheduler memanggilrun()
metode. Juga,Thread
class sementaraRunnable
adalah antarmuka.sumber
Poinnya, yang dibuat para anggota baik-baik saja jadi saya hanya ingin menambahkan sesuatu. Masalahnya adalah bahwa JAVA tidak mendukung multi-warisan. Tetapi Bagaimana jika Anda ingin mendapatkan kelas B dari kelas A lain, tetapi Anda hanya bisa berasal dari satu Kelas. Masalahnya sekarang adalah bagaimana "berasal" dari kedua kelas: A dan Thread. Karena itu Anda dapat menggunakan Runnable Interface.
sumber
Jika Anda langsung memanggil
run()
metode, Anda tidak menggunakan fitur multi-threading karenarun()
metode dijalankan sebagai bagian dari utas penelepon.Jika Anda memanggil
start()
metode di Thread, Java Virtual Machine akan memanggil metode run () dan dua utas akan berjalan bersamaan - Utas Lancar (main()
dalam contoh Anda) dan Utas Lainnya (Dapat dijalankanr1
dalam contoh Anda).Lihatlah kode sumber
start()
metode di kelas ThreadDalam kode di atas, Anda tidak dapat melihat permintaan untuk
run()
metode.private native void start0()
bertanggung jawab untukrun()
metode panggilan . JVM menjalankan metode asli ini.sumber
Dalam kasus pertama Anda hanya memohon
run()
metoder1
danr2
objek.Dalam kasus kedua Anda sebenarnya membuat 2 Thread baru!
start()
akan meneleponrun()
di beberapa titik!sumber
run method: - adalah metode abstrak yang awalnya dibuat di antarmuka Runnable dan diganti di kelas Thread serta subkelas Thread (Saat Thread mengimplementasikan Runnable dalam kode sumbernya) dan kelas implementasi lainnya dari antarmuka Runnable. - Ini digunakan untuk memuat utas (objek runnable) dengan tugas yang dimaksudkan untuk dilakukan sehingga Anda menimpanya untuk menulis tugas itu.
mulai metode: - didefinisikan dalam kelas Thread. Ketika metode start dipanggil pada objek Thread 1- ia memanggil metode internal asli (nonjava) yang disebut start0 (); metode.
start0 (); metode: bertanggung jawab atas pemrosesan rendah (pembuatan tumpukan untuk utas dan mengalokasikan utas dalam antrian prosesor) pada titik ini kami memiliki utas dalam status Ready / Runnable.
2- Pada saat Thread scheduler memutuskan bahwa sebuah thread memasuki inti prosesor untuk (prioritas thread dan juga algoritma penjadwalan OS) metode dijalankan dipanggil pada objek Runnable (apakah itu objek thread Runnable saat ini atau objek Runnable yang dilewati) ke konstruktor utas) di sini utas memasuki status Menjalankan dan mulai menjalankan tugasnya (menjalankan metode)
sumber
Metode start () dan run () yang terpisah di kelas Thread menyediakan dua cara untuk membuat program berulir. Metode start () memulai eksekusi utas baru dan memanggil metode run (). Metode start () segera kembali dan utas baru biasanya berlanjut sampai metode run () kembali.
Metode run () kelas Thread 'tidak melakukan apa-apa, jadi sub-kelas harus menimpa metode dengan kode untuk dieksekusi di utas kedua. Jika sebuah Thread dipakai dengan argumen Runnable, metode run () thread mengeksekusi metode run () dari objek Runnable di thread baru sebagai gantinya.
Bergantung pada sifat program berulir Anda, memanggil metode Thread run () secara langsung dapat memberikan output yang sama dengan memanggil melalui metode start (), tetapi dalam kasus terakhir kode tersebut sebenarnya dieksekusi di utas baru.
sumber
Mulai () metode pemanggilan metode run override dari Thread extended class dan Runnable mengimplementasikan antarmuka.
Tetapi dengan memanggil run () itu mencari metode run tetapi jika kelas mengimplementasikan antarmuka Runnable maka itu memanggil run () menimpa metode Runnable.
ex.:
`
`
sumber