Bunları öğrendim ama hangisini hangi durumlarda kullanmak mantıklı? Hocaya sordum ama düzgün cevap vermedi.
Amacin sadece multithread calistiracagin kod segmentini belirlemek ise Runnable. Farkli threadlere "bunu calistirin" diye verirsin, istedigin gibi schedule edersin. Thread'i extend ediyorsan, multithread calistiracagin run() metodundan fazlasini customize edecegin anlamina geliyor bu. Priority, Daemon vs gibi fieldlariyla oynayacagin ya da threadlocal de veri saklayacagin zamanda kullanirsin.
Modern frameworklerle calisirken ikisini de kullanmazsin. Yapilacak islerin %99 unda bir kod blogunu async calistirmaktir amacin.
Runnable sadece bir interface, bunun üzerine çalışacak kodu verirsin. Bu çalışacak kodu daha sonra thread ya da başka bir executor service ile istediğin stratejiye göre çalıştırmak sana kalmış. Thread üzerindeki start fonksiyonu JVM üzerinden yeni thread alıp runnable kodu çalıştırır.