みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

 javaの初心者です、スレッドについて質問致します、宜しくお願いします。

 スレッドは、ある物体が動くようなプログラムを作った場合に、CPUを独占しないように
Sleepを設定しCPUを解放、他の動作に振り向けるとか、また、ある説明では、貯金の出
し入れを順序よく計算させるために必要と書かれていました。

 しかし、CPUを独占させないというのは、JAVAプログラム側でわざわざコントロールしてや
る必要があるのでしょうか。というかそのような基本システムでJAVAというプログラムが最初
から作られているということでしょうか。

 もともとJAVAで作成したプログラムが動作していなくても、OS側で常時動作している他の複
数のプログラムをマルチスレッドとか、割込み対応でコントロールしているのではないのでしょ
うか。
 それとも、JAVA(とか他のCとか)で作成したプログラムが動作した場合には、この考えは
適用されないということでしょうか。
 OSとの関係(役割分担?)みたいなものがよく理解出来ません。

 常時CPUを独占しない一時的に計算をするとか、イメージを表示する静的プログラム(?)
でも、スレッドは走っていると思うのですが、ある物体が動くようなプログラムの場合には、プ
ログラム自体を走らせるスレッドと、ある物体を常時動かすスレッドと2本走っているというこ
とでしょうか。

 また、javaの場合には、このようなプログラムを組んだ場合には、必ずスレッドを組み込ん
でやる必要があるとか、エラーとか、例外が発生するということはあるのでしょうか。

投稿日時 - 2012-12-04 16:09:41

QNo.7829497

すぐに回答ほしいです

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

repaint というのはメインスレッドに paint を呼び出すように
指示を残すだけです。

アプレットのメインスレッドの処理を途中でループさせてしまうと
paint は実行されません。

投稿日時 - 2012-12-08 10:18:50

お礼

有難う御座いました。

投稿日時 - 2012-12-09 15:37:39

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

>しかし、CPUを独占させないというのは、JAVAプログラム側でわざわざ
>コントロールしてやる必要があるのでしょうか。

必要な場合があります。

例えば、フォルダを監視してファイルが置かれたら処理をする常駐型の
プログラム(プロセス/スレッド)を考えてみましょう。1秒間に一回フォルダを見に行って
ファイルがなければやることがないので眠るしかありません。
プログラムが終わってしまえば監視ができないし、かといって、
休みなくフォルダを監視しつづけたらCPU使用率が100%近くになってしまうでしょう。
これでは何も仕事をしていないのにパソコンがすごく遅くなってしまいます。

1秒間に一回見に行くだけなら何もなければCPU使用率がほぼ0%、他のプログラムは
快適に動き続けられるでしょう。

あなたの使っているワープロも、あなたのキー入力やマウス入力を待ちながら
眠っているのです。プログラムは大半の時間を何事かが起きるのを待ちながら
眠っています。だからパソコンは快適に動けるのです。

プログラムの休止は様々な事情でおきます。キー入力待ちやファイルのI/O待ちなどでも
起きます。そうした休止ができないときは意図的に sleep とか wait を使うのです。

スレッドはこのはなしよりずっとレベルの高い話なので、とりあえずこの辺で。

投稿日時 - 2012-12-06 19:04:31

お礼

 回答有難うございます。

 実はスレッドについては、以前から他の参考書とかサイトで色々と疑問点を解決しようとしましたが、
スレッドの書き方はこうというサイトは見受けるのですが、何故スレッドが必要なのか、そもそも論を解説し
ている本に出会いません。

 下の様な単純な動的(?)コードは、エラーは吐きませんが、スレッドを書いていないために動きません。
 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);
}
}

*/

投稿日時 - 2012-12-06 23:37:12

ANo.2

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

Javaプログラムは基本的にスレッド処理です。
プログラムを実行した時点で、Mainスレッドが作成される様に組み込まれています。
Web系の処理や、明示的にスレッドを作成なんてしない限りスレッドは意識しないこともあります。
Web系の処理や、明示的にスレッドを作成した場合、スレッド対応したプログラムにする(スレッドセーフ)必要はもちろんあります。
それが原因でエラーや例外が発生することもありますし、バグも発生します。

投稿日時 - 2012-12-04 21:13:47

お礼

teketonさん、回答有難う御座います。

 プロセスについて他のサイト等を調べてみました。
 確かにその辺の知識が不足しておりました。

 未だ未消化の部分がありますが、「CPUがプロセスにリソースを割り当てその処理を委譲し、プロセスの中
で更に複数のスレッドが処理される」という理解でなんとなく宜しいのでしょうか。

 それなら、

>また、CPUを独占しないようにSleepを設定すると例に上がっていましたが、こういう理由で
>やりません。OSはプロセスに対して、リソースを割り当てているので、コントロールする必
>要がないためです。

とありますが、何のためにプログラマー側が新しいスレッドを立てるのでしょうか。
 また、Sleepの設定までしてやるのでしょうか。

>「プログラムを実行した時点で、Mainスレッドが作成される様に組み込まれています。」

 ということであれば、プロセスにその処理を任せることも可能なのでしょうか。
  動的プログラムを作成した時のみ(?)プログラマーがスレッドをプログラムの中で明示的に書いてやる
理由が理解できません。

 宜しくお願い致します。

投稿日時 - 2012-12-06 10:01:02

ANo.1

JavaはOSやハードウエア依存しないプラットフォームを提供しているからです。
http://ja.m.wikipedia.org/wiki/Javaプラットフォーム#section_1

OSに依存しないのでマルチスレッド機能も実装されています。
マルチスレッドを採用するかはプログラム次第。
当然、正しくプログラムされないとエラーや例外が発生します。

投稿日時 - 2012-12-04 20:26:38

あなたにオススメの質問