Right now do !

[JAVA] 내가 생성한 Thread 이름 고유하게 유지하기

by 지금당장해

Thread가 여러개 난립하는 프로그램을 작성하다 보면 현재 Thread의 상황을 모니터링 하거나 혹은 외부에서 특정 Thread 제어가 필요한 일이 발생한다. 결국 명시적으로 setName() 메소드를 이용하여 Thread에 이름을 지정한다. 헌데 내가 생성한 Thread는 동 시점에 여러개가 alive될 수 있다. setName()함수가 이름을 고유하게 유지 시켜 주지도 않고 결국 내가 원하는 공유한 Thread이름 유지가 힘들어졌다. 뭔가 같은데 다른 구분자를 줘야 한다.

 우리가 학교 다닐때 가끔 있는 일이였지만 동명이인이 등장한다. 난감한 담임 선생님은 번호를 붙여 동명인들을 구분했다. "23번 홍길동" 이렇게 ... 필자도 Thread에 번호를 붙이기로 했다. Thread가 연속해서 생성되는 Multi-Thread라면 loop count를 붙여주면 되는데 내가 만드려는 Thread는 반복부로 생성된는 것이 아니였다. 우리반에 나 말고 홍길동이 몇 명이 있는지 알필요가 있는 상황이다. 다음 함수는 이런 필요에 의해 만들어진 Utility이니 독자분들 중에 이런 상황이 있다면 참고 하시길 ...

 

private final static Object lockOfGetName = new Object();

public static String getNextThreadName(String baseName) {
	synchronized (lockOfGetName) {

    Set<Thread> threads = Thread.getAllStackTraces().keySet();
    long cnt = threads.stream().filter(thread -> thread.getName().startsWith(baseName)).count();
    return String.format("%s-%d", baseName, cnt);
    }
}

 아침에 출근하니 개미(다시 말하지만 친구 별명이다.)가 고정크기 Thread pool을 사용할 때는 다음과 같이 위와 같은 이슈를 해결 한다고 소스코드를 슬랙으로 보내왔다. 감사.. ㅎㅎ

 

private ExecutorService createExecutorService(final int count) {
  // 
  final ThreadFactory factory = new ThreadFactory() {
    private int counter;  
    @Override
    public Thread newThread(Runnable r) {
       Thread t = new Thread(r, “홍길동_” + counter++ );
       t.setDaemon(true);
       return t;
    }
  };
  return Executors.newFixedThreadPool(count, factory);
 }

블로그의 정보

지금 당장 해!!!

지금당장해

활동하기