0

私が実行しているコアJavaサーバーが行うことの1つは、2つのタイプのタスク(T1とT2)を処理することです。元々、これらのタスクは同じキューとスレッドから処理されていました。キューに約1000のT1タスクが含まれている場合があり、これにより次のT2タスクの遅延が発生します。そこで、アーキテクチャを変更し、各タスクを別々のスレッドと別々のキューで処理することにしました。ただし、JVMは、他のスレッドに切り替えてT2タスクを処理する前に、最大1000のT1タスク(約0.6秒)を処理するようです。

「RedHatEnterpriseLinux Serverリリース6.1(サンティアゴ)」を実行しているクアッドコアマシンで実行しています。

2つのスレッドが同じCPUで実行されていると想定しています。

OSまたはJVMをより頻繁に切り替えるのを容易にする方法はありますか?また、どのスレッドがどのプロセッサによって処理されているかを確認する方法はありますか?

デバッガーを使用して、両方のスレッドが別々のスレッドとして実行されていることを確認しました。

1つのスレッドはを使用して作成されます

this.executor.Executors.newSingleThreadExecutor();

そして、タスクはを使用して送信されます

executor.submit(new Task2(..));

もう1つのスレッドは、独自のキューを管理するレガシーコードです。

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

あなたの現在の説明から、これは正解です:あなたはthread.start()ではなく呼び出す必要がありますthread.run()

そうでない場合は、コードを投稿する必要があります:)

于 2012-11-27T15:58:43.243 に答える
0

並列処理を妨げるプログラムの問題がある可能性があることを示唆するコメントに同意します。ただし、そうでない場合は、より多くの切り替えを提案するためにできることが 2 つあります。

  1. T1 スレッドの優先順位を下げます。
  2. 各 T1 タスクの最後に T1 スレッドに yield 呼び出しを挿入します。
于 2012-11-27T15:50:58.863 に答える
0

さらに分析した結果、2 つのタスクが共有する別のスレッドによって (送信前に) 遅延が発生したことがわかりました。

于 2012-12-04T19:50:50.157 に答える