私が実行しているコアJavaサーバーが行うことの1つは、2つのタイプのタスク(T1とT2)を処理することです。元々、これらのタスクは同じキューとスレッドから処理されていました。キューに約1000のT1タスクが含まれている場合があり、これにより次のT2タスクの遅延が発生します。そこで、アーキテクチャを変更し、各タスクを別々のスレッドと別々のキューで処理することにしました。ただし、JVMは、他のスレッドに切り替えてT2タスクを処理する前に、最大1000のT1タスク(約0.6秒)を処理するようです。
「RedHatEnterpriseLinux Serverリリース6.1(サンティアゴ)」を実行しているクアッドコアマシンで実行しています。
2つのスレッドが同じCPUで実行されていると想定しています。
OSまたはJVMをより頻繁に切り替えるのを容易にする方法はありますか?また、どのスレッドがどのプロセッサによって処理されているかを確認する方法はありますか?
デバッガーを使用して、両方のスレッドが別々のスレッドとして実行されていることを確認しました。
1つのスレッドはを使用して作成されます
this.executor.Executors.newSingleThreadExecutor();
そして、タスクはを使用して送信されます
executor.submit(new Task2(..));
もう1つのスレッドは、独自のキューを管理するレガシーコードです。
private final BlockingQueue<...> workQueue = new LinkedBlockingQueue<...>();
....
public void submit(Task1 task) {
workQueue.add(task);
}
....
public void run() {
while (alive){
try{
Task1 task = workQueue.take();
processwork(task);
}
....