java - 一个java线程处理的多个任务正在延迟另一个java线程

标签 java linux multithreading concurrency

我正在运行的核心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);
                    }
....

最佳答案

我同意有关可能存在阻止并行性的程序问题的评论。但是,如果情况并非如此,您可以采取两件事来建议更多切换:

  1. 降低 T1 线程的优先级。
  2. 在每个 T1 任务结束时在 T1 线程中插入一个yield 调用。

关于java - 一个java线程处理的多个任务正在延迟另一个java线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13587814/

相关文章:

java - Apache MyFaces 2.0 身份验证和授权

java - 始终从顶部开始垂直滚动条

linux - JBOSS 7 AS standalone.sh 无法访问 jboss-modules.jar

linux - 二进制文件使用什么输出/输入流?

javascript - Webwork-threads Nodejs 访问作用域外的函数/变量

multithreading - 多线程性能超越内核

java - Android - 发送大量请求的正确方法

java - 如何使用不可访问的 .jar 中的自定义对象

java - 用SwingX的ImageView进行CollorAdjust?

c++ - 每个进程消耗的内存