İş Parçacığı değil de İşleyici kullanmanın avantajları / nedenleri nelerdir?
Bir İşleyici , mesaj ve Runnable
bir iş parçacığıyla ilişkili nesneleri göndermenize ve işlemenize olanak tanır MessageQueue
. Her Handler
örnek tek bir iş parçacığı ve bu iş parçacığının ileti kuyruğu ile ilişkilendirilir.
Yeni bir oluşturduğunuzda Handler
, onu oluşturan iş parçacığının iş parçacığı / ileti kuyruğuna bağlanır - bu noktadan sonra, iletileri ve çalıştırılabilirleri bu ileti kuyruğuna gönderir ve ileti kuyruğundan çıktıkça bunları yürütür. .
İşleyicinin iki ana kullanımı vardır:
- Gelecekte bir noktada yürütülecek mesajları ve Runnable'ları planlamak için
- To enqueue bir eylem sizinkinden farklı bir iş parçacığı üzerinde gerçekleştirilecek.
Java dizileri kullanıyorsanız, bazı şeyleri kendi başınıza halletmeniz gerekir - ana iş parçacığı ile senkronizasyon, bir iş parçacığını iptal etme vb.
Bu tek İş Parçacığı, siz ThreadPoolExecutor
veya ExecutorService
API kullanmadığınız sürece bir iş parçacığı havuzu oluşturmaz .
(Bu sorguyu Blackbelt cevabındaki yorumlarınızdan aldınız)
Neden bir Cellat kullanmıyorsunuz? ve bunu yapmak için bir İşleyici kullanmak istesem bile, nasıl?
Referans: İş Parçacığı Performansı makalesi
Oldukça paralel, dağıtılmış görevlere indirgenebilecek belirli çalışma türleri vardır. Bu, iş paketlerinin büyük hacmiyle yaratır AsyncTask
ve HandlerThread
uygun sınıflar değildir. Tek iş parçacıklı doğası, AsyncTask
tüm iş parçacığı paylaşımlı işi doğrusal bir sisteme dönüştürecektir. HandlerThread
Öte yandan sınıfı kullanmak, programcının bir grup iş parçacığı arasındaki yük dengelemeyi manuel olarak yönetmesini gerektirecektir.
ThreadPoolExecutor , bu işlemi kolaylaştırmak için yardımcı bir sınıftır. Bu sınıf, bir grup iş parçacığının oluşturulmasını yönetir, önceliklerini belirler ve işin bu diziler arasında nasıl dağıtılacağını yönetir. İş yükü arttıkça veya azaldıkça, sınıf iş yüküne uyum sağlamak için daha fazla iş parçacığı döndürür veya yok eder.
BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size
ThreadPoolExecutor executor = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(), // Initial pool size
Runtime.getRuntime().availableProcessors(), // Max pool size
1, // KEEP_ALIVE_TIME
TimeUnit.SECONDS, // KEEP_ALIVE_TIME_UNIT
workQueue);
Daha fazla ayrıntı için, iş parçacığı oluşturma hakkındaki bu geliştirici kılavuzu makalesine başvurabilirsiniz .
Handler
Birden çok Runnable örneğini çalıştırmak için kullanımı için bu gönderiye bir göz atın . Bu durumda, tüm Runnable
görevler tek bir İş Parçacığında çalışacaktır.
Android: Bir ileti dizisinde tost