我已經設置了ThreadPoolExecutor並啓動線程以使用阻塞隊列中的數據。 在啓動時(當我調用下面的startThread時),阻塞隊列是空的。 我已經設置線程的超時時間非常大,以便它們不會死亡。 阻塞隊列在WorkerThreadPoolExecutor的範圍之外創建,並且Runnable項目放在它上面。ThreadPoolExecutor不使用數據
public class WorkerThreadPoolExecutor extends ThreadPoolExecutor {
private final MyBlockingQueue<MyRunnable> blockingQueue;
private ScheduledExecutorService statsExecutor = null;
public WorkerThreadPoolExecutor(MyBlockingQueue myBlockingQueue) {
super(5, 10, 5, TimeUnit.MINUTES, myBlockingQueue);
this.blockingQueue = myBlockingQueue;
}
@Override
public void shutdown() {
logger.info("Shutting down the stats emitter!");
super.shutdown();
if (statsExecutor != null) {
statsExecutor.shutdown();
}
}
public void startThreads() {
logger.info("Starting the WorkerThreadPoolExecutor!!!");
this.prestartCoreThread();
emitStats();
}
public void numThds() {
System.err.println("\t\t active: " + this.getActiveCount());
System.err.println("\t\t completed taskCount: " + this.getCompletedTaskCount());
System.err.println("\t\t core: " + this.getCorePoolSize());
System.err.println("\t\t poolsize: " + this.getPoolSize());
System.err.println("\t\t taskCount: " + this.getTaskCount());
System.err.println("\t\t Q-Size: " + this.getQueue().size());
//System.err.println("X Size is: -------------> " + blockingQueue.currentSize());
System.err.println("X Size is: -------------> " + blockingQueue.getBlockingQueue().size());
System.err.println("X Size is: -------------> " + this.getQueue().size());
}
public void emitStats() {
this.statsExecutor = Executors.newScheduledThreadPool(1);
final Runnable emitStats = new Runnable() {
public void run() {
System.err.println("Stats id: " + blockingQueue.id);
//System.err.println("Size is: -------------> " + blockingQueue.currentSize());
System.err.println("Stats size is: -------------> " + blockingQueue.getBlockingQueue().size());
numThds();
}
};
statsExecutor.scheduleAtFixedRate(emitStats, 2, 2, TimeUnit.SECONDS);
}
}
阻擋隊列上面的範圍和項目穿上它之外創建:
BlockingQueue<MyRunnable> blockingQueue = new LinkedBlockingQueue()
項目被添加到隊列中進行處理,但它們決不出隊。 我添加了產生下列結果爲統計度量:
Stats size is: -------------> 2
active: 0
completed taskCount: 0
core: 5
poolsize: 0
taskCount: 2
Q-Size: 2
X Size is: -------------> 2
X Size is: -------------> 2
如何可以強制將採取關閉阻塞隊列中的項目並執行?
爲MyRunnalbe的代碼是:
public class MyRunnable implements Runnable {
private int x;
public MyRunnable(int x) {
this.x = x;
}
public void run() {
System.out.println("----> " + x);
}
}
我通過調用創建它的一個實例:
MyRunnable mr = new MyRunnable(3);
,並通過調用排隊:
blockingQueue.add(mr);
看來儘管活動線程數爲0是可疑的! –