我正在运行的核心java服务器所做的事情之一是处理两种类型的任务(T1和T2)。最初这些任务是从同一队列和线程处理的。有时队列包含大约 1000 个 T1 任务,这会导致下一个 T2 任务延迟。所以我决定改变架构并在单独的线程和单独的队列中处理每个任务。但看起来 JVM 仍会处理约 1000 个 T1 任务(大约 0.6 秒),然后再切换到其他线程并处理 T2 任务。
我正在运行“Red Hat Enterprise Linux Server 版本 6.1(圣地亚哥)”的四核计算机上运行。
我假设两个线程在同一个 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);
}
....
最佳答案
我同意有关可能存在阻止并行性的程序问题的评论。但是,如果情况并非如此,您可以采取两件事来建议更多切换:
- 降低 T1 线程的优先级。
- 在每个 T1 任务结束时在 T1 线程中插入一个yield 调用。
关于java - 一个java线程处理的多个任务正在延迟另一个java线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13587814/