Joo*_*kka 33 java queue concurrency executorservice executor
为什么,为什么不java.util.concurrent
提供其ExecutorService
s 的队列长度指标?最近我发现自己做了这样的事情:
ExecutorService queue = Executors.newSingleThreadExecutor();
AtomicInteger queueLength = new AtomicInteger();
...
public void addTaskToQueue(Runnable runnable) {
if (queueLength.get() < MAX_QUEUE_LENGTH) {
queueLength.incrementAndGet(); // Increment queue when submitting task.
queue.submit(new Runnable() {
public void run() {
runnable.run();
queueLength.decrementAndGet(); // Decrement queue when task done.
}
});
} else {
// Trigger error: too long queue
}
}
Run Code Online (Sandbox Code Playgroud)
哪个工作正常,但......我认为这应该作为一部分实现ExecutorService
.这是一个愚蠢的错误,容易携带一个与实际队列分开的计数器,计数器应该指示它的长度(让我想起C数组).但是,ExecutorService
s是通过静态工厂方法获得的,因此无法简单地扩展优秀的单线程执行器并添加队列计数器.所以我该怎么做:
x4u*_*x4u 57
还有一种更直接的方式:
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newSingleThreadExecutor();
// add jobs
// ...
int size = executor.getQueue().size();
Run Code Online (Sandbox Code Playgroud)
虽然您可能考虑不使用Executor的方便创建方法,而是直接创建执行程序以摆脱强制转换,从而确保执行程序总是实际上是一个ThreadPoolExecutor
,即使实现Executors.newSingleThreadExecutor
将在某一天发生变化.
ThreadPoolExecutor executor = new ThreadPoolExecutor( 1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>() );
Run Code Online (Sandbox Code Playgroud)
这是从Executors.newSingleThreadExecutor
JDK 1.6中直接复制的.该LinkedBlockingQueue
传递给构造实际上是非常的对象,你会得到回来getQueue
.
归档时间: |
|
查看次数: |
20926 次 |
最近记录: |