私は自分のmultithreading
プログラムでスレッドプールユーティリティを書いています。次のメソッドが正しいことを検証する必要があります。それらは正しい値を返しますか。サイズが1のaLinkedBlockingQueue
を使用しています。また、java docを参照すると、「メソッドはおおよその数のフレーズを返す」と常に表示されます。ですから、以下の条件が正しいとは思えません。
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();
}
あなたの考えや提案を教えてください。
アップデート
興味深いのは、プールが私に3つのスレッドを返す場合、getAcceptableTaskCount
メソッドから3つのスレッドが利用可能であり、3つのタスクをプールに渡すと、1つのタスクが拒否され、によって処理されることがあり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
コンソールに出力され、タスクが完了していないことを意味します。