我有一个类(扩展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
无关。
答案 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);
}
}
}