Saya ingin objek yang akan menelurkan daemon thread yang akan terus berjalan selama proses berlangsung. Katakanlah, hanya demi argumen, bahwa ini adalah utas dalam sistem tertanam, dan menunggu untuk menerima dan menangani perintah pada beberapa port diagnostik. Tapi, bisa jadi apa saja kok. Gagasan utamanya adalah menonton sesuatu selama jangka waktu yang lama; Itu tidak melakukan urutan tugas .
Kebijaksanaan umum Jawa mengatakan, Jangan pernah instantiate Thread
, Gunakan sebagai ExecutorService
gantinya. (Misalnya, lihat jawaban ini ) Tapi apa untungnya? Menggunakan benang kolam renang sebagai sarana untuk membuat thread lama berjalan tunggal tampaknya sia-sia. Bagaimana itu akan lebih baik daripada jika saya menulis ini?
class Foobar {
public Foobar() {
this.threadFactory = Executors.defaultThreadFactory();
...
}
public Foobar(ThreadFactory threadFactory) {
this.threadFactory = threadFactory;
...
}
public void start() {
fooThread = threadFactory.newThread(new Runnable() { ... });
fooThread.setDaemon(true);
fooThread.start();
}
...
}
Catatan: pertanyaan ini tampaknya mirip dengan pertanyaan saya, tetapi jawabannya hanya mengatakan bagaimana cara menggunakan kumpulan utas, bukan mengapa .
sumber
Jawaban:
Saya pikir "Tidak pernah" adalah kata yang terlalu kuat. Ini lebih seperti aturan optimasi kedua: "Jangan (belum)".
Menurut pendapat saya, alasan utama untuk menggunakan layanan pelaksana adalah untuk mengelola jumlah utas yang berjalan. Jika Anda mengizinkan kelas sewenang-wenang untuk membuat utas mereka sendiri, Anda dapat dengan cepat menemukan diri Anda dengan 1.000 utas yang terikat CPU (atau terus-menerus bertukar konteks). Layanan pelaksana menyelesaikan masalah itu, dengan memberikan batasan pada pembuatan utas.
Alasan kedua adalah bahwa memulai sebuah utas dengan benar membutuhkan pemikiran:
System.exit()
untuk mematikan program Anda.Yang mengatakan, ada kasus-kasus tertentu di mana itu layak untuk memutar benang daripada mengandalkan kolam benang.
"Dibangkitkan secara eksternal" bergantung pada konteks. Kasing klasik adalah utas di akhir antrian atau soket pesan, yang perlu menyurvei antrian itu dan melakukan beberapa tindakan (yang mungkin melibatkan pengiriman tugas ke kumpulan).
Namun, itu juga bisa merujuk pada peristiwa yang dihasilkan di luar modul tertentu: misalnya, saya menganggap sangat masuk akal bahwa Log4J
AsyncAppender
memutar utas sendiri daripada mengharapkan aplikasi untuk menyediakan kumpulan.sumber