Kapan Anda akan menelepon Java, thread.run()
bukan thread.start()
?
java
multithreading
concurrency
kosong
sumber
sumber
t.run()
saat Anda ingin menjalankant
tugas di thread saat ini, dant.start()
saat Anda ingin menjalankant
tugas di threadt
itu sendiri. Atau apakah Anda menanyakan kasus penggunaan yang sebenarnya?start()
! Seperti saya ... Metode ini seharusnya tidak dipublikasikan!Jawaban:
Anda mungkin ingin memanggil run () dalam pengujian unit tertentu yang hanya berkaitan dengan fungsionalitas dan bukan dengan konkurensi.
sumber
Tidak pernah. Memanggil run () secara langsung hanya menjalankan kode secara sinkron (di utas yang sama), seperti panggilan metode normal.
sumber
Diambil dari FAQ utas Java Gaya Kode :
sumber
thread's run() method executes the run() method of the Runnable object in the new thread instead.
Itu tidak benar (atau setidaknya kode sumber Java 8 saya mengatakan sebaliknya), tetapi sayangnya tautannya tampaknya rusak jadi saya melaporkan kesalahan di sini.thread.run()
sebagai gantinyathread.start()
.Menjalankan
thread.run()
tidak membuat yang baruThread
di mana kode Anda dieksekusi. Itu hanya mengeksekusi kode di Thread saat ini dari manathread.run()
kode tersebut dipanggil.Eksekusi
thread.start()
membuat utas level OS baru tempatrun()
metode dipanggil.Intinya:
Selain itu, seperti yang disebutkan orang lain, 'pengujian' tampaknya menjadi satu-satunya kasus yang disarankan di mana Anda dapat memanggil
run()
langsung dari kode Anda.sumber
Ini telah disinggung, tetapi hanya untuk memperjelas: membuat objek Thread baru hanya untuk memanggil metode run () itu tidak perlu mahal dan harus menjadi bendera merah utama. Ini akan menjadi desain yang jauh lebih baik, lebih dipisahkan untuk membuat impl Runnable dan baik (a) menyebutnya itu metode run () secara langsung kalau itu perilaku yang diinginkan, atau (b) membangun Thread baru dengan yang Runnable dan mulai Thread tersebut.
Lebih baik lagi, untuk lebih banyak pemisahan, lihat
Executor
antarmuka dan kerangka kerja di JDK 5 dan yang lebih baru. Ini memungkinkan Anda, secara singkat, untuk memisahkan eksekusi tugas (contoh Runnable) dari bagaimana itu dijalankan (implementasi Executor, yang mungkin mengeksekusi Runnable di Thread saat ini, di Thread baru, menggunakan Thread yang ada dari kumpulan, dan apa tidak).sumber
Panggilan
thread.start()
, itu pada gilirannya akan meneleponthread.run()
. Tidak dapat memikirkan kasus ketika Anda ingin melewatithread.start()
dan langsung pergithread.run()
sumber
Pemisahan
start()
danrun()
metode di kelas Thread menyediakan dua cara untuk membuat program berulir. Thestart()
metode dimulai eksekusi thread baru dan memanggilrun()
metode. Thestart()
Metode segera kembali dan thread baru biasanya berlanjut sampairun()
kembali metode.Metode kelas Thread
run()
tidak melakukan apa-apa, jadi sub-kelas harus mengganti metode dengan kode yang akan dijalankan di thread kedua. Jika Thread dibuat dengan argumen Runnable, metode thread akanrun()
mengeksekusirun()
metode objek Runnable di thread baru.Bergantung pada sifat program berulir Anda, memanggil
run()
metode Thread secara langsung dapat memberikan keluaran yang sama seperti pemanggilan melaluistart()
metode, tetapi dalam kasus terakhir, kode tersebut sebenarnya dieksekusi di thread baru.referensi
sumber
The start() method returns immediately and the new thread normally continues until the run() method returns.
Jikastart()
kembali segera kenaparun()
terus berjalan mengingat itu disebut sendiri daristart()
Jika Pertanyaannya adalah - "mengapa metode mulai thread dipanggil alih-alih metode jalankan secara langsung" maka saya telah menjawab dengan contoh kode di bawah ini. Harapan yang menjelaskan. Pada Contoh di bawah ini:
sumber
Saat Anda ingin menjalankannya secara sinkron. Memanggil metode run tidak akan benar-benar memberi Anda multi-threading. Metode start membuat thread baru yang memanggil metode run.
sumber
Jika Anda ingin mengeksekusi konten run () seperti yang Anda lakukan dengan metode lain. Bukan untuk memulai utas, tentu saja.
sumber
Dengan asumsi bahwa Anda mengetahui penggunaan metode start dan run yaitu sinkron vs. asinkron; metode run dapat digunakan hanya untuk menguji fungsionalitas.
Ditambah dalam beberapa keadaan, kelas utas yang sama dapat digunakan di dua tempat berbeda dengan persyaratan fungsionalitas sinkronisasi dan asinkron dengan memiliki dua objek berbeda dengan metode jalankan satu dan metode mulai lainnya yang dipanggil.
sumber
Setidaknya di JVM 1.6., Ada sedikit pemeriksaan dan menjalankan yang disebut secara native:
sumber
Sekadar catatan untuk komentar bagus di atas: terkadang Anda menulis kode multi-utas yang menggunakan metode "mulai" untuk menjalankan utas yang berbeda. Anda akan merasa lebih mudah jika menggunakan "run" (daripada "start) untuk debugging karena ini membuat kode berjalan secara sinkron dan debugging jadi lebih mudah.
sumber
sumber