0

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

3 回答 3

0

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

  1. 降低 T1 线程的优先级。
  2. 在每个 T1 任务结束时在 T1 线程中插入一个 yield 调用。
于 2012-11-27T15:50:58.863 回答
0

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

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

于 2012-11-27T15:58:43.243 回答
0

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

于 2012-12-04T19:50:50.157 回答