我已经设置了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是可疑的! –