Anlaşılması kolay bir açıklamayla, Java'da Runnable nedir? [kapalı]


95

Java'da "çalıştırılabilir" nedir? Ben lisede bir AP programlama öğrencisiyim, görevi araştırma yapmak veya başkalarından "çalıştırılabilir" in ne olduğunu araştırmak olan (sadece OOP'a giriyoruz ve henüz konulara dokunmadık).


API belgelerinde yalnızca bir yararlı satır vardır: "Çalıştırma yönteminin genel sözleşmesi, herhangi bir eylemi gerçekleştirebilmesidir."
Tom Hawtin -

Çok daha ilginç bir araştırma görevi şöyle olabilirdi: Java'da "durdurulabilir" olan, meslekten olmayanların terimleriyle. Bugünün Eğitmenleri çok ...
Udo Klimaschewski

9
@UdoKlimaschewski - adam bir lise öğrencisi, bir lisans veya yüksek lisans öğrencisi değil. Bu eğitmenin beklentileri öğrenci ... IMO seviyesi ile orantılıdır. Bununla birlikte, "SO konusunda ilk sor" un, OP düzeyindeki biri için uygun araştırma tekniği OLMADIĞINI kabul ediyorum.
Stephen C

Yanıtlar:


192

Bir Runnable, temelde bir iş parçacığına konulabilen ve iş parçacığının ne yapması gerektiğini açıklayan bir sınıf türüdür (Runnable bir Arayüzdür).

Runnable Arayüz yöntemi uygulamak için sınıfın gerektirir run()şöyle:

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

Ve sonra şu şekilde kullanın:

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

RunnableArabirime sahip değilseniz, diğer iş parçacığındaki öğelerinizi yürütmekten sorumlu olan Thread sınıfı, sınıfınızda bir run()yöntem bulma vaadinde bulunmaz , böylece hatalar alabilirsiniz. Bu yüzden arayüzü uygulamanız gerekiyor.

Gelişmiş: Anonim Tür

Her zamanki gibi bir sınıf tanımlamanıza gerek olmadığını unutmayın, tüm bunları satır içi yapabilirsiniz:

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

Bu yukarıdakine benzer, ancak başka bir adlandırılmış sınıf oluşturmazsınız.


68
Bu, sorunun "mevcut haliyle makul bir şekilde cevaplanamayacağı" iddiasını tamamen çürüten harika bir cevaptır.
Russell Silva

1
Uzun zaman oldu biliyorum ama bir sorum var. İş parçacığı yalnızca bir kez çalıştırılıyor veya bir iş parçacığı başlattığımda programın içinde tekrar tekrar koşmaya devam mı ediyor?
gamo

5
İş parçacığı, runyöntem bitene kadar çalıştırılır , ardından iş parçacığı kapatılır. Bir iş parçacığının tekrar tekrar çalışmasını istiyorsanız, runyöntemin içine bir döngü yerleştirin .
opatut

2
Veya sadece bir Java 8 lambda işlevi kullanarak:new Thread(() -> System.out.println("hello from other thread")).start();
Gabe,

10

Runnable şu şekilde tanımlanan bir arayüzdür:

interface Runnable {
    public void run();
}

Onu kullanan bir sınıf oluşturmak için sınıfı şu şekilde tanımlamanız yeterlidir: (public) class MyRunnable implements Runnable {

Yeni bir Konu bile yapılmadan kullanılabilir. Temel olarak çağrılabilen tek bir yöntemle, çalıştırma ile temel arayüzünüzdür.

Parametresi olarak runnable ile yeni bir Thread yaparsanız, run metodunu yeni bir Thread içerisinde çağıracaktır.

Ayrıca Threads'ın uygulandığı Runnableve yeni Thread yapıldığında (yeni thread'de) çağrıldığına dikkat edilmelidir . Varsayılan uygulama, yapıcıda verdiğiniz Runnable'ı çağırır, bu yüzden new Thread(someRunnable)Thread runyöntemini geçersiz kılmadan yapabilirsiniz .


Temelde Thread'i miras almakla Runnable'ı uygulamak arasında bir fark olmadığını mı söylüyorsunuz? Thread, Runnable kullanıldığında hem yürütücü hem de sarıcı olarak kullanılır mı?
opatut

[İş Parçacığını genişletmek ve çalıştırmayı geçersiz kılmak] ile [aynı çalıştırma yöntemine sahip bir çalıştırılabilir ile yeni bir Thread örneği oluşturmak] arasında bir fark olmadığını söylüyorum
Alex Coleman

Evet anladım. Ama gerçekten ne performans ne de başka bir fark yok mu?
opatut

3
@AlexColeman - büyük bir fark var. İş Threadparçacığı havuzunu uzatırsanız ve iş parçacığı havuzunu uygulamazsanız, her zaman yeni iş parçacığı oluşturmanın önemli maliyetini üstlenirsiniz . Aksine, sadece uygulama, 3. taraf iş parçacığı havuzu Runnablegibi şeyleri kolayca kullanabileceğiniz anlamına gelir ThreadPoolExecutorService.
Stephen C
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.