1 52 53 package com.go.trove.util.tq; 54 55 67 public class TransactionQueueThreadTuner extends TransactionQueueAdapter { 68 private long mLastQueueTime; 69 private long mLastServiceTime; 70 71 private long mTotalQueueDelta; 72 private long mTotalServiceDelta; 73 74 private boolean mBaton; 75 76 public synchronized void transactionDequeued(TransactionQueueEvent e) { 77 long queueTime = e.getStageDuration(); 78 mTotalQueueDelta += queueTime - mLastQueueTime; 79 mLastQueueTime = queueTime; 80 81 if (!mBaton) { 82 mBaton = true; 83 tune(e); 84 } 85 } 86 87 public synchronized void transactionServiced(TransactionQueueEvent e) { 88 long serviceTime = e.getStageDuration(); 89 mTotalServiceDelta += serviceTime - mLastServiceTime; 90 mLastServiceTime = serviceTime; 91 92 if (mBaton) { 93 mBaton = false; 94 tune(e); 95 } 96 } 97 98 private void tune(TransactionQueueEvent e) { 99 if (mTotalQueueDelta > mTotalServiceDelta) { 100 TransactionQueue queue = e.getTransactionQueue(); 101 int maxThreads = queue.getMaximumThreads(); 102 if (maxThreads <= queue.getThreadCount() * 2) { 103 queue.setMaximumThreads(maxThreads + 1); 105 } 106 } 107 else if (mTotalServiceDelta > mTotalQueueDelta) { 108 TransactionQueue queue = e.getTransactionQueue(); 109 int maxThreads = queue.getMaximumThreads(); 110 if (maxThreads > 1) { 111 queue.setMaximumThreads(maxThreads - 1); 113 } 114 } 115 } 116 } 117 | Popular Tags |