• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:スレッドの必要性、OSとの関係について教えて下さ)

スレッドの必要性、OSとの関係について教えて下さい

このQ&Aのポイント
  • スレッドとは、ある物体が動くようなプログラムを作った場合に、CPUを独占しないようにするために使用されます。
  • スレッドは、Sleepを設定することで他の動作にCPUを振り向けることができます。また、順序よく計算させるためにも使用されます。
  • JAVAプログラムでは、スレッドをコントロールする必要があります。しかし、OS側も複数のプログラムをマルチスレッドでコントロールしています。

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

  • ベストアンサー
回答No.4

repaint というのはメインスレッドに paint を呼び出すように 指示を残すだけです。 アプレットのメインスレッドの処理を途中でループさせてしまうと paint は実行されません。

eiji_0035
質問者

お礼

有難う御座いました。

その他の回答 (3)

回答No.3

>しかし、CPUを独占させないというのは、JAVAプログラム側でわざわざ >コントロールしてやる必要があるのでしょうか。 必要な場合があります。 例えば、フォルダを監視してファイルが置かれたら処理をする常駐型の プログラム(プロセス/スレッド)を考えてみましょう。1秒間に一回フォルダを見に行って ファイルがなければやることがないので眠るしかありません。 プログラムが終わってしまえば監視ができないし、かといって、 休みなくフォルダを監視しつづけたらCPU使用率が100%近くになってしまうでしょう。 これでは何も仕事をしていないのにパソコンがすごく遅くなってしまいます。 1秒間に一回見に行くだけなら何もなければCPU使用率がほぼ0%、他のプログラムは 快適に動き続けられるでしょう。 あなたの使っているワープロも、あなたのキー入力やマウス入力を待ちながら 眠っているのです。プログラムは大半の時間を何事かが起きるのを待ちながら 眠っています。だからパソコンは快適に動けるのです。 プログラムの休止は様々な事情でおきます。キー入力待ちやファイルのI/O待ちなどでも 起きます。そうした休止ができないときは意図的に sleep とか wait を使うのです。 スレッドはこのはなしよりずっとレベルの高い話なので、とりあえずこの辺で。

eiji_0035
質問者

お礼

 回答有難うございます。  実はスレッドについては、以前から他の参考書とかサイトで色々と疑問点を解決しようとしましたが、 スレッドの書き方はこうというサイトは見受けるのですが、何故スレッドが必要なのか、そもそも論を解説し ている本に出会いません。  下の様な単純な動的(?)コードは、エラーは吐きませんが、スレッドを書いていないために動きません。  Whileの中でrepaint()を書いても何故かpaint()を呼びません。  ルーチン的には(?)repaint()がpaint()を呼ぶはずと考えたのですが、、、、理由が分かりません。  やはり動的コードでは、スレッドの考えを入れてやらないと実質的にはエラーになるという見本だと思います。  Thre2は強制的にpaint()を呼ぶと(at java.lang.Thread.run(Unknown Source))という エラーをはきます。  勿論最終的には、スレッドから動かすと正常に動作します。  2本のコードはここが間違い、正しいコードはスレッドを使うべき、という理由を、動的コードにはスレッド を使うという方法論だけでなく、どうしても自分の中で解決したいのですが、宜しくお願い致します。 ============================================================ public class Thre1 extends Applet { int dX = 300; public void start() { while(true) { repaint(); dX = dX - 50; if (dX<-100) dX = 300; } } public void paint(Graphics g) { g.drawString("Hello Java !!",dX,200); } } /* =========================================================== public class Thre2 extends Applet { int dX = 300; Graphics g; public void start() { while(true) { paint(g) repaint(); dX = dX - 50; if (dX<-100) dX = 300; } } public void paint(Graphics g) { g.drawString("Hello Java !!",dX,200); } } */

  • teketon
  • ベストアンサー率65% (141/215)
回答No.2

ご意見を見た限りでは、プロセスとスレッドをごっちゃにしているように感じました。 コンピュータは処理をするときに、通常プロセスと呼ばれる単位で処理が動きます。 プロセスを作る...メモリやCPUと言ったリソース割当て作業は負荷(コスト)が高く、 並列にたくさん処理したい場合には不向きと分かっています(あとはメモリを共有したいときも不向きですね)。 じゃ、プロセスに割り当てたリソースをプロセス内で並列に処理したらいいんじゃないか?、という処理方法がスレッド単位の処理です。 また、CPUを独占しないようにSleepを設定すると例に上がっていましたが、こういう理由でやりません。OSはプロセスに対して、リソースを割り当てているので、コントロールする必要がないためです。 やるならば、GUI、ファイルやデータベースのI/O処理で、効率良く使うために、コントロールする処理は書くことがあります(これはOSがプロセスに対して使ってもいいよ、と指示することはあっても、今使ってないからリソース勝手に開放するねといった処理を行えないからです)。 だから、sleepの目的はCPUの開放ではなく、他スレッドへの処理を移譲することです。 Javaプログラムは基本的にスレッド処理です。 プログラムを実行した時点で、Mainスレッドが作成される様に組み込まれています。 Web系の処理や、明示的にスレッドを作成なんてしない限りスレッドは意識しないこともあります。 Web系の処理や、明示的にスレッドを作成した場合、スレッド対応したプログラムにする(スレッドセーフ)必要はもちろんあります。 それが原因でエラーや例外が発生することもありますし、バグも発生します。

eiji_0035
質問者

お礼

teketonさん、回答有難う御座います。  プロセスについて他のサイト等を調べてみました。  確かにその辺の知識が不足しておりました。  未だ未消化の部分がありますが、「CPUがプロセスにリソースを割り当てその処理を委譲し、プロセスの中 で更に複数のスレッドが処理される」という理解でなんとなく宜しいのでしょうか。  それなら、 >また、CPUを独占しないようにSleepを設定すると例に上がっていましたが、こういう理由で >やりません。OSはプロセスに対して、リソースを割り当てているので、コントロールする必 >要がないためです。 とありますが、何のためにプログラマー側が新しいスレッドを立てるのでしょうか。  また、Sleepの設定までしてやるのでしょうか。 >「プログラムを実行した時点で、Mainスレッドが作成される様に組み込まれています。」  ということであれば、プロセスにその処理を任せることも可能なのでしょうか。   動的プログラムを作成した時のみ(?)プログラマーがスレッドをプログラムの中で明示的に書いてやる 理由が理解できません。  宜しくお願い致します。

  • localica
  • ベストアンサー率52% (202/385)
回答No.1

JavaはOSやハードウエア依存しないプラットフォームを提供しているからです。 http://ja.m.wikipedia.org/wiki/Javaプラットフォーム#section_1 OSに依存しないのでマルチスレッド機能も実装されています。 マルチスレッドを採用するかはプログラム次第。 当然、正しくプログラムされないとエラーや例外が発生します。

関連するQ&A

専門家に質問してみよう