Java 如何显示n theads的当前吞吐量?

Java 如何显示n theads的当前吞吐量?,java,multithreading,algorithm,throughput,Java,Multithreading,Algorithm,Throughput,想象一下,有n个线程都在SOAP端点上工作,以获取一些数据并将其存储到文件系统中。显示这些线程最后一秒的吞吐量的最佳方式是什么 我有以下想法: 所有32个线程(本例中为n)都持有一个AtomicInteger,在将一个文件写入文件系统后,每个线程都会增加该值。然后由另一个线程(#33)对该AtomicInteger进行评估,该线程正好用于记录该AtomicInteger除以n个线程,通过使用度量(剩余条目总数/吞吐量)估计ETA将AtomicInteger重置为零,然后休眠一秒钟并继续循环,直到

想象一下,有n个线程都在SOAP端点上工作,以获取一些数据并将其存储到文件系统中。显示这些线程最后一秒的吞吐量的最佳方式是什么

我有以下想法:

所有32个线程(本例中为
n
)都持有一个
AtomicInteger
,在将一个文件写入文件系统后,每个线程都会增加该值。然后由另一个线程(#33)对该
AtomicInteger
进行评估,该线程正好用于记录该
AtomicInteger
除以n个线程,通过使用度量(剩余条目总数/吞吐量)估计ETA将
AtomicInteger
重置为零,然后休眠一秒钟并继续循环,直到所有线程完成其工作

然而,这有以下问题:AtomicInteger的锁定将导致性能的一些损失(虽然我认为它可以忽略不计),并且输出永远不会是最后一秒,因为锁定时间会有一些变化。 有谁能想出一个更优雅的解决这个问题的办法吗?我想我可能是想得太多了,Java已经有了一些解决方案

即使可能有第三方的解决方案或软件包,我也希望了解如何正确地完成这项工作,而不仅仅是使用软件包


线程由执行器服务生成,所有线程都是可运行的。

最简单的方法是仅第n次更新,例如,如果AtomicInteger是瓶颈,则仅每100次调用更新一次。我建议首先使用Atomicinteger,只有当您发现有问题时,才使用更复杂的解决方案。
例如,有用于采样统计信息的库,但由于您只想测量一个端点,这不符合您的需要。

最简单的方法是只更新第n次,例如,如果AtomicInteger是瓶颈,则仅每100次调用更新一次。我建议首先使用Atomicinteger,只有当您发现有问题时,才使用更复杂的解决方案。
例如,有用于抽样统计的库,但由于您只想测量一个端点,因此这不符合您的需要。

我认为您对指标收集有一个非常定制的要求。我怀疑是否有任何度量集合库能够满足您的期望。也许是测微计计数器

问题根源: 您正试图由n+1个工作进程同时读取和写入同一资源。该用例允许您使用分散/聚集模式的变体,其中一个工人可以聚合n个工人的工作,n个工人可以读取/写入他们自己拥有的n个资源

假设: 我假设您对列表或数组中的所有线程都有引用,并且没有超过
Integer.MAX\u VALUE
的文件

解决方案: 您可以在每个线程中使用
volatile int
作为组合,而不是从外部传递
AtomicInteger
。这些计数器将单调递增,并且永远不会在计算线程中修改或重置

您可以在计算线程中保留int值的本地副本,并从新值中减去此本地副本,以获得在最后一秒处理的文件,并使用新值更新本地副本(这相当于将每个线程的计数器重置为0)。或者,如果可以,您可以只跟踪计数器的总和,而不是存储每个线程的计数器

class Computation implements Runnable {

    List<Worker> workerList;
    int[] localCounters;

    boolean finished;

    public Computation(List<Worker> workerList) {
        this.workerList = workerList;
        this.localCounters = new int[workerList.size()];
    }

    @Override
    public void run() {

        while (!finished) {

            for (int i = 0; i < workerList.size(); i++) {
                localCounters[i] = workerList.get(i).getCounter();
            }

            computation();
            pause();
        }
    }

    private void computation(){
        //do your computation with localCounters
        //this.localCounters[x]
    }

    private boolean isFinished () {
        return finished;
    }

    private void pause() {
        try {
            Thread.sleep(1000L);
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
class Worker implements Runnable {

    private volatile int counter;

    @Override
    public void run() {
        // do your thing.
    }

    public int getCounter() {
        return counter;
    }
}
类计算实现可运行{
列表工作列表;
int[]本地计数器;
布尔完成;
公共计算(列表工作列表){
this.workerList=workerList;
this.localCounters=newint[workerList.size()];
}
@凌驾
公开募捐{
当(!完成){
对于(int i=0;i
我认为您对指标收集有一个非常定制的要求。我怀疑是否有任何度量集合库能够满足您的期望。也许是测微计计数器

问题根源: 您正试图由n+1个工作进程同时读取和写入同一资源。该用例允许您使用分散/聚集模式的变体,其中一个工人可以聚合n个工人的工作,n个工人可以读取/写入他们自己拥有的n个资源

假设: 我假设您对列表或数组中的所有线程都有引用,并且没有超过
Integer.MAX\u VALUE
的文件

解决方案: 您可以在每个线程中使用
volatile int
作为组合,而不是从外部传递
AtomicInteger
。这些计数器将单调递增,并且永远不会在计算线程中修改或重置

您可以在计算线程中保留int值的本地副本,并从新值中减去此本地副本,以获得在最后一秒处理的文件,并使用新值更新本地副本(这将相当于重置co