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

时间:2012-11-27 15:44:43

标签: java linux multithreading concurrency

我正在运行的核心java服务器之一就是处理两种类型的任务(T1和T2)。最初这些任务是从同一队列和线程处理的。有时队列包含大约1000个T1任务,这会导致下一个T2任务的延迟。所以我决定改变架构并在一个单独的线程和单独的队列中处理每个任务。但看起来JVM仍然会在切换到另一个线程并处理T2任务之前处理~1000 T1任务(大约.6秒)。

我在运行“Red Hat Enterprise Linux Server 6.1(Santiago)”的四核机器上运行。

我假设这两个线程正在同一个CPU上运行。

有没有办法方便操作系统或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);
                    }
....

3 个答案:

答案 0 :(得分:0)

我同意这些意见,表明可能存在妨碍并行性的程序问题。但是,如果情况并非如此,那么可以做两件事来建议更多切换:

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

答案 1 :(得分:0)

根据您当前的说明,这是正确的答案:您需要调用thread.start()而不是thread.run()

如果不是,您需要发布代码:)

答案 2 :(得分:0)

经过更多分析后,我发现延迟是由两个任务共享的另一个线程提前(在提交之前)引起的。