当线程为2时,该值不是从JMH中的字典中获取的?

时间:2018-05-20 12:47:31

标签: multithreading dictionary jmh

对于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.

1 个答案:

答案 0 :(得分:1)

Thread.activeCount()回答系统中的线程数,不一定是基准线程数。使用它来划分基准线程之间的工作是危险的,因为这种基本的断开。 ThreadParams可能有助于获取基准线程索引,如果需要,请参阅relevant example

如果您想要一个更确定的答案,您需要提供明确突出您问题的MCVE。