• ベストアンサー

スレッド

スレッドは同時に複数の実行はできないそうですが、同時に複数の処理を行うと書かれています。実行とは開始という意味でしょうか?

  • peiee
  • お礼率60% (51/84)
  • Java
  • 回答数4
  • ありがとう数7

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

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.2

実行可能状態と休止状態の違いね。 実行可能状態というのは その言葉のとおり、いつでも実行可能な状態よ。 指示さえ与えられればそのスレッドは実行されるわ。 休止状態というのは 「休止」命令が与えられている状態よ。 休止に期間が指定されていれば その期間経過後に実行可能状態になるわ。 ここで問題になってくるのは 休止状態と実行可能状態の明示的な違いよね。 どっちの状態も、実行命令が与えられれば スレッドは実行可能よ。 でも、休止状態のときに実行命令が与えられた場合 定められた休止期間を終了していないのに 実行命令が与えられたので例外が発生するわ。 消防士さんでたとえるなら 実行可能状態は指示さえあればいつでも出動可能な人 休止状態はお休み中の人ね。 お休み中に出動命令が出たら嫌だから文句(例外)を出す。 というとこで > 実行とは開始という意味でしょうか? Yes。 正確には 実行可能状態から実行中に変化させる と言うべきかしら。 > スレッドは同時に複数の実行はできないそうですが これの意味がわかったわ。 スレッドには優先順位というものがそんざいするの。 2つのスレッドに対し同時に実行命令を出しても かならずその優先順位に従って実行されるわ。 逆を言うと、この仕組みがあるのがスレッドなのよ。 言うならば、1+1=2である、っていうのと同じレベルね。 そう決めてあるの。 > 同時に複数の処理を行うと書かれています スレッドを利用しないってことは、すべての処理は順序良く実行されるわ。 つまり直列よね。 でもスレッドを使うことで、並列に処理することができるようになる。 ここまではいいかしら? この並列に行うことを「同時に複数の処理」と言っているわ。 優先順位の関係で、同時に開始することはできないけど でも動き出してしまえばそれらは同時に動いているので 同時に複数ってわけ。 長々と書いたけど 伝わるかな。 少なくとも実行可能と休止の違いは伝わったんじゃないかなーと思う

peiee
質問者

お礼

e00083さんが書かれた「マルチスレッド」について調べてから、読み直すと非常に理解できました。ありがとうございました。

peiee
質問者

補足

ありがとうございます。 >休止状態というのは >「休止」命令が与えられている状態よ。 >休止に期間が指定されていれば 「休止」命令と休止期間はコマンドプロンプトでコマンドでも入力するのですか? JAVAの話とは違うのでしょうか?どのようなコマンドを入力するのですか?

その他の回答 (3)

  • e00083
  • ベストアンサー率31% (25/80)
回答No.4

おそらくデッドロックのことでしょう。 マルチスレッドプログラミングで起こりやすいバグの1つです。 この文章的には実行とはファイルを開くなど、パソコン的な処理で 処理とはプログラム的な処理でしょう。

peiee
質問者

お礼

「スレッドは、複数の処理を同時に行うしくみである。」 この意味は、複数の処理(プログラムの実行などのプロセス)が同時に行われた場合、 その処理は、それぞれ別のメモリ領域で実行され、 それぞれのプログラムでの処理(スレッド)は、 同時に実行できるという意味かもしれません。 ありがとうございました。

peiee
質問者

補足

回答ありがとうございます。ファイルを開くという処理は確かに同時にはできませんね。 ところでプログラム的な処理とは、どのようなものでしょう。 プログラムを実行するという意味だと、何となくプロセスが起動しているようですね。

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.3

>「休止」命令と休止期間はコマンドプロンプトでコマンドでも入力するのですか? > JAVAの話とは違うのでしょうか?どのようなコマンドを入力するのですか? Javaなら Thread.sleep(期間); よね。 コマンドプロンプトがなぜでてきたのか不明だけど コマンドプロンプトにもsleepコマンドはあるわよ。

peiee
質問者

お礼

JAVAは実行まで、プログラムで制御できるのですか。ありがとうございました。

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

> スレッドは同時に複数の実行はできないそうですが、 どこの誰から聞いたものかしら? > 同時に複数の処理を行うと書かれています どこの誰から聞いたものかしら? > 実行とは開始という意味でしょうか? むしろ私が聞きたいくらいね 文章はそれを書いた人の表現だから 何を持ってそれを語ったかによって 意味がまったく異なってくるわ。 その文章の前後の内容・言った状況にもかかわってくるしね。 ピンポイントだけ書かれても それを言った人の言いたいことは判断するのが難しいわ。 > スレッドは同時に複数の実行はできないそうですが、 複数のスレッドが「同時」に「実行」されることは 問題なくできるわよ。 でもスレッドAとスレッドBが1つの処理の内部で わずかなずれなく「同時」に「開始」するのは無理ね。 a.start(); b.start(); としても、必ずaがわずかながら早く開始するわ。 誤差の範囲だとは思うけど。 > 同時に複数の処理を行うと書かれています この一文はさっぱり意味がわからないわね。 複数のスレッドが同時に動いていることを指すのかしら。 とりあえず想定できそうなことは書いてみたけど あなたの質問にピンポイントで回答するのは 今の情報だけでは無理だわ。

peiee
質問者

補足

回答ありがとうございます。文章を変えて質問していました。すいません。 「同時に複数のスレッドを実行することはできないため、1つのスレッドが実行している間は他のスレッドを実行できません。」 この文は、スレッドの状態の説明にありました。スレッドの状態には、「実行中」「実行可能」「休止」「終了」があること説明した後の文章なので、実行に誤差があるという意味だと思います。そう考えると実行は開始という意味かと思えます。 「スレッドは複数の処理を行うしくみである」とはスレッドの説明の最後に要点として書かれていました。 ところで、「実行可能」は実行できる状態であるが、他のスレッドが実行中のため、CPUの割り当てを待っている状態です。「休止」はスレッドのAPIで提供されているメソッドなどを使用して明示的に休止している状態ですと書かれていました。 スレッドの状態の「実行可能」と「休止」の違いが良く分かりません。「実行可能」はCPUの割り当てがどれくらいか、決まれば実行可能になるという意味でしょうか?「休止」はAPIが絡んでいますが、APIはスレッドの生成と管理を行うために提供されています。このように書かれていても、「実行可能」と「休止」の意味がぴんときません。他の表現で教えてもらえないでしょうか。お願いします。

関連するQ&A

  • スレッド

    Thread th; //スレッド変数th宣言 public void start() {th = new Thread(); th.start();} //スレッドの開始 run(){Thread me = Thread.currentThread();      while(th == me){動作変数の処理} paint(){画像表示} 以上のような処理なのですが、 よく意味がわかりません。 特にwhile文の部分です。 currentThread とは?と聴いたところ 「現在実行中のスレッド」 だと言われました。 変数meに現在動作中のスレッドを代入する。 ??よく事情がわからないのです。 このプログラムはdrawOvalで丸を描いて、それを移動させると言うものなのですが、スレッドは2つ動いてると言うのです。動作変数処理と表示処理の2つだそうです。 で、meが動作、thが表示だと言うのですが正しいですか?まず通常動作するスレッドとth.start()で動くスレッドで、2つということはわかります。 で、現在実行中のスレッドと実行させたスレッドが等しい(trueまたはfalse)だと言うことが何を意味しているのか・・・????なのです・・・ これはどういうことなのでしょうか?? 質問してもまだ良くわからなそうなかおをしていたところ 「2つの処理を同時に処理するためと覚えてください」 と切り捨てられてしまいました。 これは正しいでしょうか・・・? 記述の足りない部分は補足いたします。 ご指摘お願いします。

    • ベストアンサー
    • Java
  • 「スレッド」の概念について質問

    スレッドとは、「1つのプログラムにおいての1つの処理(メソッド)」のことで、これはシングルスレッドともよぶ。 マルチスレッドは、複数の処理を「同時に実行する」こと。但し、実際にはcpuは1つなので、擬似的に複数処理をしているようにみせかけている。 例えば、マルチスレッドは、ブラウザに例えれば、画像をダウンロードしながら、画面をスクロールしたりというように、複数の処理を同時に実行している。そして、この処理の1つ1つがスレッド。 こういうことでしょうか?

    • ベストアンサー
    • Java
  • Javaのスレッドとcpuのスレッド

    javaのスレッドは各スレッドを少しずつ実行してあたかも同時に実行しているように見せかけているだけだと本で読んだことがあります。現在のcpuはi7 8700kだと6コア12スレッドになりますが、この場合どのような動きになるのでしょうか。 例えば12個のスレッドを使用したプログラムを実行するとpcが勝手に8700kの12スレッドに割り振って実行してくれるのか、それとも単にcpuの1スレッドでjavaの12スレッドを同時に動かしてるように見せかけるのか、cpuのスレッドとjavaのスレッドの関係がいまいち解りません。

  • スレッドについてお教えください。

    スレッドについてお教えください。 今、画面のプログラムより、帳票を出力しています。 帳票の出力に時間がかかるため画面のプログラムとは非同期に 別スレッドにして帳票を出力しようと考えたのですがこの場合 一つの帳票の処理中に同じ要求が複数来た場合、スレッドは 複数立ちあがってしまい帳票の順番が狂ってしまうものと 思います。 これを要求はキューしていくが、処理は順次行う(1処理終了後に 次の要求を処理する)ということは可能なのでしょうか? お願いいたします。

  • スレッドについて

    JAVAでプログラムを書く上で、Aという処理が終了次第、Bという処理を実行したい場合どうすればいいのでしょうか? ///////////////////////////////////////////////////////////////// 例えば、 ・ファイルにデータを出力する。(例えば、バッチファイルhoge.batとして) その後、すぐに ・そのバッチファイルを実行する命令を書く(Runtime.exec(hoge.bat); ///////////////////////////////////////////////////////////////// このプログラムを実行した場合、スレッドAがファイルにデータを出力し終わる前に勝手にスレッドBが作られ、Runtime.exec(hoge.bat);が実行されてしまいます。正しくスレッドAが終了し終わった後にスレッドBが実行し始めるようにするにはどうすればいいのでしょうか?教えてください。お願いします。

    • ベストアンサー
    • Java
  • C# スレッドでフォームを扱う

    スレッドとフォームの連携について質問があります。 「開始」ボタンをクリックしたら、 「開始」ボタンのEnableをfalseにして 他のクラスのスレッドで処理を開始します (中断ボタンが押されたら処理をやめるためにスレッド採用) この時、処理が終わったら「開始」ボタンのEnableをtrueに戻したいのです。 デリゲートのコールメソッドを使ったところ、フォームを生成したスレッド以外からフォームををいじってはいけないというエラーがでてしまいました。 [a]ユーザー操作を待ち受けるフォームのスレッド [b]処理系のスレッド このようなスレッドの構成の時、[a]が[b]の処理が終わったことを知り、buttonのプロパティを変更するためには、どうすればよいでしょうか?

  • マルチスレッドのスレッド数を増やしたい

    <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <質問概略> CWinThread*を使って無限ループのスレッドを作ったのですが、 無限ループのスレッドをもう一つ作り、同時に実行しようとするとアクセスバイオレーションのエラーでます。 複数スレッドの作り方を教えていただけますと幸いです。 <質問詳細> 現状の正常に実行できるソースの必要最小限を書きます。 <.h> class CMyDlg : public CDialog{ public:   static UINT ThreadFunc( LPVOID pParam );   void Thread(); // スレッドの処理 protected:   CWinThread* m_pThread;//スレッドのアドレス }; <.cpp> void CMyDlg::OnButton(){   m_pThread = AfxBeginThread( ThreadFunc, this );   for(;;) /*無限ループ処理1*/ ; } UINT CMyDlg::ThreadFunc( LPVOID pParam ){   ((CMyDlg*)pParam)->Thread();   return 0; } void CMyDlg::Thread(){   for(;;) /*無限ループ処理2*/ ; } これに、 void CMyDlg::Thread2(){   for(;;) /*無限ループ処理3*/ ; } のようなスレッドを追加したいのですが全然出来ません。 宜しければご指摘お願い致します。

  • スレッドが実行中かどうかの確認

    画面の中にボタンを作成し、そのボタンを押すとスレッドが実行される機能を作成しました。 「一度ボタンを押してスレッドが実行中の場合は処理を実行しない」 という処理を実装したいです。 上記の処理を以下のソースで考えていますが(1)の部分がわかりません。 そもそも(1)のようなことが可能かもわかっていない状況です。 (1)のようなことは可能なのでしょうか? どなたか、知恵を貸していただければと思います。 よろしくお願い致します。 /* ソース */ public class ExThread1 extends Thread{  public void run() {   // 処理  } } public class TEST {  public static void main(String[] args){   ExThread1 thread1 = new ExThread1();   // (1)スレッドが実行中ならstartしない   if(スレッドが実行中ではない){    thread1.start();   }  } }

    • ベストアンサー
    • Java
  • 2つのスレッドの実行について

    お世話になります。 VS2005C#で作成しております。 以下のコードにてスレッドを2つ実行させ、終了を監視する処理を記述しました。 ----------------------------------------------------------------------------------------------------------- isRcvSearchFlg = 0; isFwdSearchFlg = 0; private int SetDataTreeView() { // それぞれのデータ格納処理をスレッドで処理する Thread RcvSetThread = new Thread(new ThreadStart(this.RcvDataSet)); Thread FwdSetThread = new Thread(new ThreadStart(this.FwdDataSet));   RcvSetThread.Start(); FwdSetThread.Start(); // 両方のスレッドが終了するまで待機する while (isRcvSearchFlg != 1 && isFwdSearchFlg != 1) Application.DoEvents(); } delegate void RcvDataSetDelegate(); void RcvDataGridSet() { /* メインフォーム内のDatagidview(1)への値の代入 */ isRcvSearchFlg = 1; } void RcvDataSet() { Invoke(new RcvDataSetDelegate(RcvDataGridSet)); } delegate void FwdDataSetDelegate(); private void FwdDataGridSet() { /* メインフォーム内のDatagidview(2)への値の代入 */ isRcvSearchFlg = 1; } void FwdDataSet() { Invoke(new FwdDataSetDelegate(FwdDataGridSet)); } ----------------------------------------------------------------------------------------------------------- RcvDataGridSet、FwdDataGridSetでログを出力して、進行状況を監視しておりますが、どうも2つのスレッドが同時に走っていないようなのです。 原因として考えられることはございますでしょうか。 また、同時に走らせるコードはありますでしょうか。 お手数ですが、ご教授いただきたく宜しくお願い申し上げます。

  • Ruby(CRuby)におけるマルチスレッド処理が可能?

    Ruby(CRuby)におけるマルチスレッド処理が可能? 今、マルチコアCPUが普及しています。 その恩恵を受け、処理を分割して複数のプロセッサーで同時に実行させたいのですが、 Rubyは、こういうような複数のスレッドの同時実行をサポートしているのでしょうか?