获取java中的活动线程数

时间:2016-02-16 11:11:22

标签: java multithreading

我有一个类(扩展Thread),我正在运行多个线程。

这是班级:

public class Abc extends Thread{
    private String key;
    public void run(){}
}

现在,我想根据key的值了解此类有多少活动线程。

例如。我将key的值设置为10个线程中的“X”和15中的“Y”。我想创建一个映射:

map<String, int> :: {"X"=10, "Y"=15}

我该怎么做?

编辑:

Map<>将存储在创建线程的Execute类中。它与Abc无关。

4 个答案:

答案 0 :(得分:3)

您可以在任务开始时递增计数器,并在完成任务时递减计数器。

这样的东西
public void run() {
     AtomicInteger counter = counterMap.computeIfAbsent(key, k -> new AtomicInteger());
     counter.incrementAndGet();
     try {
         doRun();
     } finally {
         counter.getAndDecrement();
     }
 }

答案 1 :(得分:0)

使key静态,以便它在线程中保持其值。

答案 2 :(得分:0)

您可以这样做:

{2=self, 1=test}
{1=self1}

并在线程结束时减少计数:

static HashMap<String, Integer> threadsCount = new HashMap<String, Integer>();
String key;

public Abc(String key) {
    this.key = key;
    synchronized (threadsCount) {
        if (threadsCount.containsKey(key)) {
            threadsCount.put(key, threadsCount.get(key) + 1);
        } else {
            threadsCount.put(key, 1);
        }
    }
}

@ vish4071,根据您的评论,我认为对您的用例更好的解决方案是:

@Override
public void run() {
    ....
    synchronized (threadsCount) {
        if (threadsCount.containsKey(this.key)) {
            threadsCount.put(key, threadsCount.get(this.key) - 1);
        }
    }
}

得到计数:

public class Abc extends Thread {
    String key;

    public Abc(String key) {
        this.key = key;
    }

    public String getKey(){
        return key;
    }
    ....
}

答案 3 :(得分:0)

    public class Abc extends Thread{
        private static Map<String, Integer> map = new ConcurrentHashMap<>();
        private String key;
        public void run(){
            synchronized (key) {
                Integer current = map.get(key);
                if(null == current) {
                    map.put(key, 1);
                } else {
                    map.put(key, current +1);
                }
            }

            //Run execution code here.
            synchronized (key) {
                Integer current = map.get(key);
                map.put(key, current -1);
            }
        }
    }