Saya memiliki kumpulan utas tetap yang saya ajukan tugas (terbatas pada 5 utas). Bagaimana saya bisa mengetahui salah satu dari 5 utas yang menjalankan tugas saya (sesuatu seperti "utas # 3 dari 5 melakukan tugas ini")?
ExecutorService taskExecutor = Executors.newFixedThreadPool(5);
//in infinite loop:
taskExecutor.execute(new MyTask());
....
private class MyTask implements Runnable {
public void run() {
logger.debug("Thread # XXX is doing this task");//how to get thread id?
}
}
% numThreads
sebagai gantinyagetId()
adalah14291
dimanagetName()
memberikanpool-29-thread-7
, yang saya berpendapat lebih berguna.Jawaban yang diterima menjawab pertanyaan tentang mendapatkan sebuah benang id, tetapi tidak membiarkan Anda melakukan "Thread X dari Y" pesan. Id utas unik di seluruh utas tetapi tidak harus dimulai dari 0 atau 1.
Ini adalah contoh yang cocok dengan pertanyaan:
dan hasilnya:
Tweak sedikit menggunakan modulo arithmetic akan memungkinkan Anda untuk melakukan "thread X of Y" dengan benar:
Hasil baru:
sumber
Anda dapat menggunakan Thread.getCurrentThread.getId (), tetapi mengapa Anda ingin melakukan itu ketika objek LogRecord dikelola oleh logger sudah memiliki id utas. Saya pikir Anda kehilangan konfigurasi di suatu tempat yang mencatat Id thread untuk pesan log Anda.
sumber
Jika kelas Anda mewarisi dari Thread , Anda dapat menggunakan metode
getName
dansetName
untuk memberi nama setiap thread. Kalau tidak, Anda bisa menambahkanname
bidangMyTask
, dan menginisialisasi dalam konstruktor Anda.sumber
Jika Anda menggunakan logging maka nama utas akan membantu. Pabrik utas membantu dalam hal ini:
Keluaran:
sumber
Ada cara mendapatkan utas saat ini:
Setelah Anda mendapatkan objek kelas Thread (t) Anda bisa mendapatkan informasi yang Anda butuhkan menggunakan metode kelas Thread.
Mendapatkan ID thread:
Nama uttting:
sumber