programing

스레드 풀에서 스레드 ID를 가져오려면 어떻게 해야 합니까?

newsource 2022. 12. 6. 21:59

스레드 풀에서 스레드 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