我正在运行的核心 Java 服务器所做的一件事是处理两种类型的任务(T1 和 T2)。最初这些任务是从同一个队列和线程中处理的。有时队列包含大约 1000 个 T1 任务,这会导致下一个 T2 任务延迟。所以我决定改变架构并在单独的线程和单独的队列中处理每个任务。但看起来 JVM 在切换到另一个线程并处理 T2 任务之前仍会处理约 1000 个 T1 任务(大约 0.6 秒)。
我在运行“Red Hat Enterprise Linux Server release 6.1 (Santiago)”的四核机器上运行。
我假设这两个线程在同一个 CPU 上运行。
有什么方法可以让 OS 或 JVM 更频繁地切换?还有一种方法可以查看哪个处理器正在处理哪个线程?
我已经使用调试器验证了两个线程都作为单独的线程运行。
使用创建一个线程
this.executor.Executors.newSingleThreadExecutor();
任务是使用提交的
executor.submit(new Task2(..));
另一个线程是管理它自己的队列的遗留代码:
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);
}
....