2017-06-05 58 views
1

計算性能比較我有一個同時執行一些繁重的操作的線程池,下面是我的代碼的Java:每秒

ExampleCompute.java

class ExampleCompute { 
    private List<long> allData = new ArrayList<long>(); 
    ExecutorService executor = Executors.newFixedThreadPool(1000); 

    public calculate() { 
     for(int i=0; i<myData.size; i++) { 
     MyWorker worker = new MyWorker(myData.get(i)); 
     Future<long> currentDataPoint = executor.submit(worker); 
     allData.add(currentDataPoint); 
     } 

     executor.shutdown(); 
     while (!executor.isTerminated()) { 
     } 
    } 
} 

什麼,我試圖做的是打印到屏幕每N秒每秒完成多少次操作。

例如

// Every 10 seconds do the following 
System.out.println("Thread pool is completing 533 calculation per second"); 

什麼是實現這一目標的最佳方式是什麼?

+0

有簡單的方法和複雜的方法。一個簡單的方法是在工作完成後讓工作人員設置更新。但是由於計時或工作狀態與運行任務的業務邏輯無關,因此可以使用AOP切點來截取結束事件。 AOP方法可能過度殺傷,但我認爲它的前進方向是正確的。 –

+0

Aop會達到性能。對於時間指標,它不應該增加任務執行的所有複雜性。您是否希望時間是平均值或即時時間。如果是平均值,那麼在完成工作時您可以計算平均值。 –

+0

即時。如果我想要平均數據,我可能會記錄數據並在稍後運行查詢。 – user316114

回答

1

您可以使用前和方法後,跟蹤的時間

public class TrackingThreadPool extends ThreadPoolExecutor { 

    private final ThreadLocal<Long> startTime = new ThreadLocal<Long>(); 
    private volatile long totalTime; 
    private volatile long totalTasks; 

    public TrackingThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, 
      BlockingQueue<Runnable> workQueue, ThreadFactory factory) { 
     super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, factory); 
    } 

    protected void beforeExecute(Thread t, Runnable r) { 
     super.beforeExecute(t, r); 
     startTime.set(new Long(System.currentTimeMillis())); 
    } 

    protected void afterExecute(Runnable r, Throwable t) { 

     long time = System.currentTimeMillis() - startTime.get().longValue(); 

     synchronized (this) { 
      totalTime += time; 
      ++totalTasks; 
     } 

     super.afterExecute(r, t); 
    } 
}