Secara sederhana untuk memahami penjelasan, apa itu Runnable di Java? [Tutup]

92

Apa itu "runnable" di Java, dalam istilah awam? Saya seorang siswa pemrograman AP di sekolah menengah, yang tugasnya adalah melakukan penelitian, atau mencari tahu dari orang lain apa yang "dapat dijalankan" (kami baru saja masuk ke OOP, dan belum menyentuh utas).

pengguna1809295
sumber
Hanya ada satu baris yang berguna dalam dokumen API: "Kontrak umum dari metode yang dijalankan adalah bahwa ia dapat mengambil tindakan apa pun."
Tom Hawtin - tackline
Tugas penelitian yang jauh lebih menarik adalah: Apa yang "bisa dihentikan" di Jawa, dalam istilah awam. Instruktur hari ini sangat ...
Udo Klimaschewski
9
@UdoKlimaschewski - pria itu adalah siswa sekolah menengah, bukan siswa sarjana atau pascasarjana. Harapan instruktur ini sepadan dengan tingkat siswa ... IMO. Namun, saya setuju bahwa "pertanyaan pertama tentang SO" BUKAN merupakan teknik penelitian yang tepat untuk seseorang di tingkat OP.
Stephen C

Jawaban:

189

Runnable pada dasarnya adalah jenis kelas (Runnable adalah Antarmuka) yang dapat dimasukkan ke dalam utas, menjelaskan apa yang seharusnya dilakukan utas.

The Runnable Antarmuka membutuhkan kelas untuk menerapkan metode run()seperti:

public class MyRunnableTask implements Runnable {
     public void run() {
         // do stuff here
     }
}

Dan kemudian gunakan seperti ini:

Thread t = new Thread(new MyRunnableTask());
t.start();

Jika Anda tidak memiliki Runnableantarmuka, kelas Thread, yang bertanggung jawab untuk mengeksekusi barang Anda di thread lain, tidak akan memiliki janji untuk menemukan run()metode di kelas Anda, sehingga Anda bisa mendapatkan error. Itulah mengapa Anda perlu mengimplementasikan antarmuka.

Lanjutan: Jenis Anonim

Perhatikan bahwa Anda tidak perlu mendefinisikan kelas seperti biasa, Anda dapat melakukan semua itu secara sebaris:

Thread t = new Thread(new Runnable() {
    public void run() {
        // stuff here
    }
});
t.start();

Ini mirip dengan di atas, hanya saja Anda tidak membuat kelas bernama lain.

opatut
sumber
68
Ini adalah jawaban yang bagus yang membantah sepenuhnya klaim bahwa pertanyaan "tidak dapat dijawab secara wajar dalam bentuknya saat ini".
Russell Silva
1
Saya tahu itu sudah lama tetapi saya punya pertanyaan. Thread hanya dijalankan satu kali atau terus berjalan di dalam program saat saya memulai thread?
gamo
5
Utas dijalankan hingga runmetode selesai, lalu Utas ditutup. Jika Anda ingin utas berjalan berulang kali, letakkan loop di dalam runmetode.
opatut
2
Atau cukup gunakan fungsi lambda Java 8:new Thread(() -> System.out.println("hello from other thread")).start();
Gabe
9

Runnable adalah antarmuka yang didefinisikan sebagai:

interface Runnable {
    public void run();
}

Untuk membuat kelas yang menggunakannya, cukup definisikan kelas tersebut sebagai (public) class MyRunnable implements Runnable {

Ini dapat digunakan bahkan tanpa membuat Thread baru. Ini pada dasarnya antarmuka dasar Anda dengan satu metode, jalankan, yang dapat dipanggil.

Jika Anda membuat Thread baru dengan runnable sebagai parameternya, itu akan memanggil metode run di Thread baru.

Perlu juga dicatat bahwa Threads diimplementasikan Runnable, dan itu dipanggil saat Thread baru dibuat (di thread baru). Implementasi default hanya memanggil Runnable apa pun yang Anda serahkan ke konstruktor, itulah sebabnya Anda bisa melakukannya new Thread(someRunnable)tanpa mengganti runmetode Thread .

Alex Coleman
sumber
Apakah Anda mengatakan pada dasarnya tidak ada perbedaan antara mewarisi Thread atau menerapkan Runnable? Apakah Thread saat menggunakan Runnable digunakan sebagai pembungkus, serta eksekutornya?
opatut
Saya katakan bahwa tidak ada perbedaan antara [memperpanjang Thread dan proses overriding] dan [membuat instance baru dari Thread dengan runnable yang memiliki metode run yang sama]
Alex Coleman
Ya, mengerti. Tetapi apakah benar-benar tidak ada perbedaan, baik kinerja- maupun sebaliknya?
opatut
3
@AlexColeman - ada perbedaan besar . Jika Anda memperpanjang Threadpenggabungan thread itu sulit dan jika Anda tidak menerapkan penggabungan thread, Anda akan dikenakan biaya yang signifikan untuk membuat thread baru setiap saat. Sebaliknya, hanya menerapkan Runnableberarti Anda dapat dengan mudah menggunakan hal-hal seperti ThreadPoolExecutorServiceatau kumpulan utas pihak ketiga.
Stephen C