• ベストアンサー

Servletとマルチスレッド

以下のようにServlet側のある部分をマルチスレッドで実装しましたが、まったく速くなりません。Servletはもともとマルチスレッドで動いてるから速くならないのか、それとも自分のソースがおかしいのかわかりません、どなたかおしえていただけますか? public class ***Servlet exends ** { private void hogehoge(){ HogeThread hoge1 = new HogeThread(); Thread th1 = new Thread(hoge, ""); th1.start(); HogeThread hoge2 = new HogeThread(); Thread th2 = new Thread(hoge, ""); th2.start(); } } class HogeThread implements Runnable { public void run() { // hogehoge } }

質問者が選んだベストアンサー

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.3

> 理論上処理速度は2倍になる スレッドが2つ(対象URLが2つ)なら、各処理速度は1/2になります。小学校の算数です。ただし、マルチスレッドを使うと、2つめ以降のI/Oの、自分の番の開始をえんえん待たされる苦痛は軽減します。高級なマシンでは、ローカルなディスクI/Oでもマルチスレッドを使いますし、それがn個のマルチコアを有効に使っていれば、まさしく、全体の速度はほぼn倍になります。

hasekyou
質問者

お礼

返信が遅くなりました。ありがとうございます。大変勉強になりました。

その他の回答 (3)

  • nakatyuu
  • ベストアンサー率20% (2/10)
回答No.4

No.1です。 No.2さんが言うように、1つの資源(CPU、ネットワーク、など)を 2つのスレッドが同時に使用することにより、 それぞれが、半分の資源を使用して同時に動いている状態になる為、 CPUの演算速度、ネットワークからの受信速度が、 1つづつ処理する時の半分になります。 そのため、実行時間の短縮にはならなかったのだと言えます。 今回のような処理は、プログラムの修正によって、 倍の速度にする事は難しいと思います。(私には無理ですね)

hasekyou
質問者

お礼

ずっと付き合ってくれてありがとうございます。 >CPUの演算速度、ネットワークからの受信速度が、1つづつ処理する時の半分になります。 javaVMとマルチコアの関係について勉強不足で何も言えませんが、まだ試す方法はあると思います。 少しJavaから話題をそらしますが、Linuxのwgetを使用する場合、URLが大量にある場合は、私はsplitでURLのリストを分割して複数のwgetを実行するようにしています。もちろん結果的にひとつのwgetを実行するより速いです。もちろん、これはOSのプロセスの話で、javaのスレッドと一緒に論じてはいけないと思いますが、今回のようなマルチスレッド処理速度を改善する方法がないと思いたくないです。また時間があるときにいろいろ試してみます。

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

マルチスレッドにして速くなるのは、マルチコアが有効に使われているときのみです。Javaではインタフェイスを長時間凍結しないためにビジネスタスク(典型的にはI/OやDBアクセス、クライアント処理、長時間計算など)を別スレッドにしますが、それは“速くする”とは関係ありません。

参考URL:
http://java.sun.com/docs/books/tutorial/essential/concurrency/index.html
  • nakatyuu
  • ベストアンサー率20% (2/10)
回答No.1

プログラムの実行速度を上げるには、 どこに(どんな処理に)時間がかかっているかを 調査してからではないと対処できないと思います。 しかも、ご提示のソースでは残念ながら、それが伝わりません。 スレッドを複数にすることで早くなる処理、かも解からないのです。 まず、どこに(どんな処理に)時間がかかっているかを調査しましょう。

hasekyou
質問者

補足

ご返信ありがとうございます。補足します。 上記のrun()の中で以下のようにURLの接続からストリームを読み込む処理をしています。読み込み対象URLの数が多いのでマルチスレッドを実装しようと思いました。で、一番最初に示したソースでは、HogeThreadクラスのインスタンスを二つ生成しているので、理論上処理速度は2倍になる、というのが私の予想、狙いでした。よろしくお願いします。 class HogeThread implements Runnable { public void run() { // 各URL間に依存関係はありません。 URL url = new URL("http://***"); readStream(url.openStream()); } }

関連するQ&A

専門家に質問してみよう