Java: Thread.currentThread (). Sleep (x) vs. Thread.sleep (x)

86

Saya memiliki ini di kode saya

Thread.currentThread().sleep(x);

Eclipse memberi tahu saya untuk menggunakan statis

Thread.sleep(x); 

sebaliknya, mengapa? Apa bedanya, apakah ada perbedaan dalam fungsi sama sekali antara 2 metode ini?

Omu
sumber
1
ada 'Save Action' di Eclipse yang secara otomatis akan mengganti akses anggota statis melalui variabel instan dengan akses statis melalui nama kelas - aktifkan Save Action ini dan sebanyak Save Action lainnya yang Anda setujui (misalnya, hapus cast yang tidak perlu, tidak perlu 'ini', dll.).
les2

Jawaban:

136

Hanya ada satu metode, bukan dua, dan itu statis. Meskipun Anda dapat memanggil metode statis melalui referensi instance, itu bukan gaya yang baik. Ini menunjukkan programmer mengira dia memanggil metode instance. Seorang programmer yang bingung mungkin berpikir dia dapat menyebabkan thread lain (bukan yang sekarang) untuk tidur seperti ini, padahal bukan itu yang dilakukannya.

Kedua baris kode Anda melakukan hal yang sama tetapi yang kedua adalah gaya yang lebih baik.

Sean Owen
sumber
25
1 untuk menyebutkan bahwa pemrogram mungkin ingin membuat utas tertentu tidur melalui someThread.sleep (), yang tidak dilakukan.
Chii
32

Di Java, tidur adalah metode statis. Kedua contoh Anda melakukan hal yang persis sama, tetapi versi sebelumnya membingungkan karena tampaknya memanggil metode pada objek tertentu tetapi tidak melakukan itu sama sekali. Dalam contoh Anda, itu tidak terlalu penting, tetapi akan lebih berbahaya jika Anda memiliki yang berikut:

someOtherThread.sleep(x);

Kali ini sepertinya Anda memberi tahu utas lain untuk tertidur, tetapi sebenarnya Anda sedang menyetel utas saat ini ke mode tidur. Cara untuk menghindari membuat jenis kesalahan ini adalah dengan selalu memanggil metode statis menggunakan kelas daripada objek tertentu.

Mark Byers
sumber
Maksud Anda, currentThread dan someOtherThread akan tidur saat mengeksekusi baris tunggal ini "someOtherThread.sleep (x);" ??
Kanagavelu Sugumar
3
Tidak. Utas saat ini akan tidur, apa pun objek Thread .sleep dipanggil. Anda tidak dapat menidurkan ThreadS lain (seperti itu).
Torsi
3

Kedua panggilan metode memiliki perilaku yang identik karena mereka memanggil metode yang sama tetapi menggunakan nama kelas ( Thread dalam kasus ini) daripada contoh untuk mengakses bidang statis dan metode membuat statis-ness ini jelas. Itulah mengapa peringatan ini dibuat.

Tetapi mengingat bahwa bidang dan metode statis ditampilkan dengan cara tertentu di sebagian besar IDE (misalnya dalam font miring di Eclipse dan IntelliJ IDEA), apakah peringatan ini masih diperlukan? Mungkin tidak seperlunya seperti di masa-masa awal Java, editor sederhana digunakan.

Amir Moghimi
sumber
0

Thread.currentThread().sleep(x);atau cara Eclipse mengatakan bahwa Thread.sleep(x);konteks statis diperlukan jika diperlukan, jadi kami tunggu sebentar saat tidur ini.

Paradigma statis yang ditetapkan oleh satu objek, hanya mempengaruhi siklus hidup cetak tumpukan objek tertentu, sekali lagi mengingat keseluruhan Siklus Hidup Objek statis tidak terlalu mengganggu, jika diperlukan dapat digunakan untuk memudahkan pengkodean, tetapi harus dilakukan dengan hati-hati sebagai kaki statis- print dirujuk oleh Class(misalnya: - Class.forName(pkg.className)) sesuai namanya dan bukan oleh apa pun objectyang merupakan salinan cetak tunggal Kelas dalam HEAPmemori.

Sekali lagi penggunaan objek juga memiliki pro & kontra oleh referensi jenis Lemah, Hantu, Kuat ....,

Kode Berbelit-belit oleh Alam. Ini hanyalah cara yang kami lakukan untuk membuatnya berfungsi & berfungsi.

Dev Anand Sadasivam
sumber
1
Untuk berbicara tentang utas, - itu muncul secara asinkron, meskipun kami mungkin memiliki hal-hal yang sinkron dalam threading. Secara alami, semua hal adalah asinkron, meskipun kami terkadang menemukan hal-hal yang sinkron. Tak satu pun dari hal-hal yang sinkron bahkan saat kita memasuki Quantum atau Astronomy.
Dev Anand Sadasivam