스레드 풀에서 스레드 ID를 가져오려면 어떻게 해야 합니까?
작업을 제출하는 고정 스레드 풀이 있습니다(5 스레드로 제한).5개의 스레드 중 어떤 스레드가 작업을 수행하는지 확인하려면 어떻게 해야 합니까('스레드 #3 of 5'는 이 작업을 수행하고 있습니다).
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?
}
}
사용.Thread.currentThread()
:
private class MyTask implements Runnable {
public void run() {
long threadId = Thread.currentThread().getId();
logger.debug("Thread # " + threadId + " is doing this task");
}
}
수락된 답변은 스레드 ID를 가져오는 질문에 답하지만 "X/Y 스레드" 메시지를 수행할 수 없습니다.스레드 ID는 스레드 전체에서 고유하지만 반드시 0 또는 1에서 시작하는 것은 아닙니다.
다음은 질문에 일치하는 예를 제시하겠습니다.
import java.util.concurrent.*;
class ThreadIdTest {
public static void main(String[] args) {
final int numThreads = 5;
ExecutorService exec = Executors.newFixedThreadPool(numThreads);
for (int i=0; i<10; i++) {
exec.execute(new Runnable() {
public void run() {
long threadId = Thread.currentThread().getId();
System.out.println("I am thread " + threadId + " of " + numThreads);
}
});
}
exec.shutdown();
}
}
및 출력:
burhan@orion:/dev/shm$ javac ThreadIdTest.java && java ThreadIdTest
I am thread 8 of 5
I am thread 9 of 5
I am thread 10 of 5
I am thread 8 of 5
I am thread 9 of 5
I am thread 11 of 5
I am thread 8 of 5
I am thread 9 of 5
I am thread 10 of 5
I am thread 12 of 5
모듈로 연산을 사용하여 약간 수정하면 "X/Y 스레드"를 올바르게 수행할 수 있습니다.
// modulo gives zero-based results hence the +1
long threadId = Thread.currentThread().getId()%numThreads +1;
새로운 결과:
burhan@orion:/dev/shm$ javac ThreadIdTest.java && java ThreadIdTest
I am thread 2 of 5
I am thread 3 of 5
I am thread 3 of 5
I am thread 3 of 5
I am thread 5 of 5
I am thread 1 of 5
I am thread 4 of 5
I am thread 1 of 5
I am thread 2 of 5
I am thread 3 of 5
Thread.getCurrent를 사용할 수 있습니다.Thread.getId(). 단, 로거에 의해 관리되는 LogRecord 객체에 이미 스레드 ID가 있는데 이 작업을 수행하는 이유는 무엇입니까?로그 메시지의 스레드 ID를 기록하는 설정이 어딘가에 없는 것 같습니다.
로깅을 사용하는 경우 스레드 이름이 유용합니다.스레드 팩토리는 다음과 같은 이점을 제공합니다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
public class Main {
static Logger LOG = LoggerFactory.getLogger(Main.class);
static class MyTask implements Runnable {
public void run() {
LOG.info("A pool thread is doing this task");
}
}
public static void main(String[] args) {
ExecutorService taskExecutor = Executors.newFixedThreadPool(5, new MyThreadFactory());
taskExecutor.execute(new MyTask());
taskExecutor.shutdown();
}
}
class MyThreadFactory implements ThreadFactory {
private int counter;
public Thread newThread(Runnable r) {
return new Thread(r, "My thread # " + counter++);
}
}
출력:
[ My thread # 0] Main INFO A pool thread is doing this task
클래스가 스레드에서 상속되는 경우 메서드를 사용할 수 있습니다.getName
그리고.setName
각 스레드에 이름을 붙입니다.그렇지 않은 경우,name
까지 수비하다.MyTask
컨스트럭터에서 초기화합니다.
현재 스레드는 다음과 같은 방법으로 얻을 수 있습니다.
Thread t = Thread.currentThread();
스레드 클래스 객체(t)를 얻은 후 스레드 클래스 메서드를 사용하여 필요한 정보를 얻을 수 있습니다.
스레드 ID 가져오기:
long tId = t.getId(); // e.g. 14291
스레드 이름 getting:
String tName = t.getName(); // e.g. "pool-29-thread-7"
언급URL : https://stackoverflow.com/questions/3294293/how-to-get-thread-id-from-a-thread-pool
'programing' 카테고리의 다른 글
동일한 방법으로 (서로 참조하는)2개의 리스트를 정렬하는 방법 (0) | 2022.12.06 |
---|---|
특정 어레이 인덱스에 값이 존재하는 경우 JavaScript에서 체크인을 하려면 어떻게 해야 합니까? (0) | 2022.12.06 |
VuesJ, v-for 루프에서 랜덤 키 생성 (0) | 2022.11.27 |
파이어베이스 관찰 방법auth().currentUser.displayName 및 기타 변경 속성 (0) | 2022.11.27 |
풀 패스를 지정하면 모듈을 Import하려면 어떻게 해야 합니까? (0) | 2022.11.27 |