2010-07-20 22 views
112

मेरे पास एक निश्चित थ्रेड पूल है जो मैं कार्य सबमिट करता हूं (धागे तक सीमित)। मैं कैसे पता लगा सकता हूं कि उनमें से कौन सा थ्रेड मेरे कार्य को निष्पादित करता है (कुछ " का थ्रेड # 3 इस कार्य को कर रहा है")?थ्रेड पूल से थ्रेड आईडी कैसे प्राप्त करें?

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? 
    } 
} 

उत्तर

182

Thread.currentThread() का उपयोग करना:

private class MyTask implements Runnable { 
    public void run() { 
     long threadId = Thread.currentThread().getId(); 
     logger.debug("Thread # " + threadId + " is doing this task"); 
    } 
} 
+3

यह वास्तव में वांछित जवाब नहीं है, किसी को – petrbel

+0

@petrbel के बजाय '% numThreads' का उपयोग करना चाहिए, वह पूरी तरह से प्रश्न शीर्षक का जवाब दे रहा है, और ओपी अनुरोध करता है कि ओपी "5 की थ्रेड # 3 की तरह कुछ" अनुरोध करता है। – CorayThan

1

अपनी कक्षा Thread से विरासत हैं, तो आप तरीकों getName उपयोग कर सकते हैं और setName प्रत्येक थ्रेड नाम है। अन्यथा आप name फ़ील्ड को MyTask पर जोड़ सकते हैं, और इसे अपने कन्स्ट्रक्टर में प्रारंभ कर सकते हैं।

6

आप थ्रेड.getCurrentThread.getId() का उपयोग कर सकते हैं, लेकिन आप ऐसा क्यों करना चाहेंगे जब LogRecord लॉगर द्वारा प्रबंधित ऑब्जेक्ट्स में पहले से ही थ्रेड आईडी है। मुझे लगता है कि आप कहीं भी कॉन्फ़िगरेशन खो रहे हैं जो आपके लॉग संदेशों के लिए थ्रेड आईडी को लॉग करता है।

22

स्वीकृत उत्तर थ्रेड आईडी प्राप्त करने के बारे में प्रश्न का उत्तर देता है, लेकिन यह आपको "वाई का थ्रेड एक्स" संदेश नहीं देता है। थ्रेड आईडी धागे में अद्वितीय होते हैं लेकिन जरूरी नहीं कि एक उदाहरण सवाल मिलान किया जाता है से 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(); 
    } 
} 

और आउटपुट:

[email protected]:/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 

एक मामूली ट्वीक मॉड्यूलो अंकगणितीय का उपयोग करने से आपको "थ्रेड एक्स वाई" सही तरीके से करने की अनुमति मिल जाएगी:

// modulo gives zero-based results hence the +1 
long threadId = Thread.currentThread().getId()%numThreads +1; 

नए परिणाम :

[email protected]:/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 
+4

क्या जावा थ्रेड आईडी संगत होने की गारंटी है? यदि नहीं, तो आपका मॉड्यूल सही तरीके से काम नहीं करेगा। –

+0

@BrianGordon गारंटी के बारे में निश्चित नहीं है, लेकिन कोड एक आंतरिक काउंटर को बढ़ाने से कहीं ज्यादा कुछ नहीं लगता है: http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/ जावा/लैंग/थ्रेड.जावा # एल 217 –

+5

तो यदि दो थ्रेड पूल एक साथ शुरू किए गए थे, तो उन थ्रेड पूलों में से एक थ्रेड में आईडी हो सकती है, उदाहरण के लिए, 1, 4, 5, 6, 7 और उस स्थिति में आप "मैं 5 में से थ्रेड एन" संदेश के साथ दो अलग-अलग धागे हैं। –

0

यदि आप लॉगिंग का उपयोग कर रहे हैं तो थ्रेड नाम सहायक होंगे। एक धागा कारखाना इस के साथ मदद करता है:

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 
संबंधित मुद्दे