对于JMH类,通过 @Threads(1)将线程数限制为1。
但是,当我使用 Thread.activeCount()获取线程数时,它会显示有2个线程。
代码的简化版本如下:
@Fork(1)
@Warmup(iterations = 10)
@Measurement(iterations = 10)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Threads(1)
public class MyBenchmark {
@State(Scope.Benchmark)
public static class BState {
@Setup(Level.Trial)
public void initTrial() {
}
@TearDown(Level.Trial)
public void tearDownTrial(){
}
}
@Benchmark
public List<Integer> get(BState state) {
System.out.println("Thread number: " + Thread.activeCount());
...
List<byte[]> l = new ArrayList<byte[]>(state.dict.get(k));
...
}
}
实际上,该值会尝试使用其键从词典获取。但是,当存在2个线程时,密钥无法从字典中获取,并且此处 list l变为[] 。
为什么没有拿钥匙?我将线程数限制为1.
答案 0 :(得分:1)
Thread.activeCount()
回答系统中的线程数,不一定是基准线程数。使用它来划分基准线程之间的工作是危险的,因为这种基本的断开。 ThreadParams
可能有助于获取基准线程索引,如果需要,请参阅relevant example。
如果您想要一个更确定的答案,您需要提供明确突出您问题的MCVE。