我正在我的程序中编写一个线程池实用multithreading
程序。我只需要验证以下方法是否正确,它们是否为我返回正确的值。我使用的是LinkedBlockingQueue
大小为 1 的 a。我还参考了 java 文档,它总是说“方法将返回近似的”数字短语。所以我怀疑以下天气条件是否正确。
public boolean isPoolIdle() {
return myThreadPool.getActiveCount() == 0;
}
public int getAcceptableTaskCount() {
//initially poolSize is 0 ( after pool executes something it started to change )
if (myThreadPool.getPoolSize() == 0) {
return myThreadPool.getCorePoolSize() - myThreadPool.getActiveCount();
}
return myThreadPool.getPoolSize() - myThreadPool.getActiveCount();
}
public boolean isPoolReadyToAcceptTasks(){
return myThreadPool.getActiveCount()<myThreadPool.getCorePoolSize();
}
请让我知道您的想法和建议。
更新
有趣的是,如果池返回我,则该getAcceptableTaskCount
方法有 3 个线程可用,当我将 3 个任务传递给池时,有时一个任务被拒绝,它由RejectedExecutionHandler
. 有时池会处理我通过的所有任务。我想知道为什么池被拒绝任务,因为我根据可用线程数传递任务。
--------- 灰色答案的执行---
class MyTask implements Runnable {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("exec");
}
}
@Test
public void testTPool(){
ExecutorService pool = Executors.newFixedThreadPool(5);
List<Future<MyTask>> list = new ArrayList<Future<MyTask>>();
for (int i = 0; i < 5; i++) {
MyTask t = new MyTask();
list.add(pool.submit(t, t));
}
for (int i = 0; i < list.size(); i++) {
Future<MyTask> t = list.get(i);
System.out.println("Result -"+t.isDone());
MyTask m = new MyTask();
list.add(pool.submit(m,m));
}
}
这将在控制台中打印Result -false
,表示任务未完成。