複数のスレッドから1つのスレッドの関数を順次呼び出した場合の動作について

このQ&Aのポイント
  • 複数のスレッドから1つのスレッドの関数を順次呼び出した場合の動作について教えてください。
  • スレッドが8個ある場合、あるスレッドが別のスレッドの関数を呼び出す場合、順次呼び出されるのか、それとも並列処理されるのかを教えてください。
  • 具体的な例として、スレッド1がgetHoge()を呼び出し、その後、スレッド2もgetHoge()を呼び出した場合、スレッド2はスレッド1が終了するまで待つのか、それとも並列で実行されるのか教えてください。
回答を見る
  • ベストアンサー

複数のスレッドから1つのスレッドの関数を呼び出す場合、順次呼び出したいのですがどうしたらいいですか?

スレッドが8個あったとして スレッド1、スレッド2、スレッド3から スレッド5の関数を呼び出したとする。 この場合どうなるか教えてください。 どうなるというのは例として スレッド1 → getHoge() を呼び出した。 スレッド2 → getHoge() を呼び出した。 スレッド3 → getHogeHoge() を呼び出した。 場合、 スレッド2がgetHoge()を呼び出したときに、 スレッド1が呼び出したgetHoge()が終了していないとすると 1.スレッド1の呼び出したgetHoge()が終了後スレッド2が呼び出した getHoge()を実行していくのか? 2.スレッド1の呼び出したgetHoge()とスレッド2の呼び出したgetHoge()が並列処理されるのか? public class TThread extends Thread { (関数は質問趣旨とは関係ないので省略して書く) public int getHoge(); public int getHogeHoge(); }

  • Java
  • 回答数4
  • ありがとう数0

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

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

まず勘違いしているのは Threadを継承したクラスのメソッドだからといって そのメソッドが別スレッドで実行されるわけではないということです。 Thread#run内の処理が別スレッドで起動するだけです。 スレッド1からgetHogeを呼び出せばgetHogeは スレッド1上で実行され スレッド2からgetHogeを呼び出せば スレッド2上で実行されます。 synchronized public int getHoge() とすれば getHogeが複数のスレッドから呼び出されても同時に走る事はありません。 (スレッド1とスレッド2が同時に呼び出そうとすれば、どちらかが待機状態になります。) synchronizedを宣言しなければ スレッド1とスレッド2からgetHogeが同時に呼ばれる可能性があります。

その他の回答 (3)

回答No.4

「getHoge()を呼び出した」所の処理がどうなっているのか分からないので、同じく参考意見で。 たぶん、wait()とかnotifyAll()を利用すればいいだけだと思うけど・・。 マルチスレッドプログラミング 5章 スレッドの同期 5.2. スレッド間の待ち合わせ http://www.techscore.com/tech/J2SE/Thread/5-2.html マルチスレッドの同期 3スレッド以上の同期 http://ash.jp/java/sync.htm java.lang クラス Object http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/Object.html

  • thamansa
  • ベストアンサー率40% (95/232)
回答No.3

>スレッド1、スレッド2、スレッド3から >スレッド5の関数を呼び出したとする。 この記述から察するにどこかで勘違いなさっていると思います。 (スレッドとプロセスは違いますが、)本件の場合、 プロセスが8つあって、プロセス1と2と3が、 それぞれのプロセスの中で getHoge()、getHoge()、getHogeHoge()を 呼び出すのと同じような動きになります。 つまり、互いに干渉せず、並列に実行されます。 質問の回答とすると、 スレッド2がgetHoge()を呼び出せば、 スレッド1が呼び出したgetHoge()が終わっていなくても スレッド2のgetHoge()が並列に実行開始されます。

  • auty
  • ベストアンサー率58% (284/486)
回答No.2

スレッド1、スレッド2、スレッド3が共にTThread のインスタンスなら、 この場合、getHoge()はそのインスタンスメソッドだから全く関係なく独立に実行されるのでは。(並列処理)

関連するQ&A

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

    画面の中にボタンを作成し、そのボタンを押すとスレッドが実行される機能を作成しました。 「一度ボタンを押してスレッドが実行中の場合は処理を実行しない」 という処理を実装したいです。 上記の処理を以下のソースで考えていますが(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
  • Java:スレッドでエラー発生時に処理を終わらせる

    以下の事が出来ずに悩んでいます。 これ参考になるかな? というようなWEBページ等がありましたら、教えていただけると助かります。 ■やりたいこと ・aaa.javaから、「スレッド1」「スレッド2」「スレッド3」の処理を呼び出し、それぞれのスレッドで処理を実行する。 ・全てのスレッド処理が完了したら、次の処理へ進む。 ・「スレッド1、2、3」で、何かしらのエラーが発生した場合は、「aaa.java」の処理を終わらせる。 ■現状 ・aaa.javaから、「スレッド1、2、3」の処理を呼び出し、それぞれ処理を実行させる事は出来た。 ・すべてのスレッドが完了したら次の処理へ進む事は出来た。 ・「スレッド1、2、3」のどこかでエラーが発生した場合でも、処理の完了となり、「次の処理」へ進んでしまう。 もうちょっと細かい事を書くと、各スレッドでは、それぞれデータ作成のSQLを実行する処理をさせているのですが、 そのSQLが何かしらの要因でエラーで戻ってきた場合、次の処理へ進んでしまうとまずいです。 そのため、どこかのスレッドのSQLがエラーになったら、スレッドを呼び出した元の「aaa.java」でエラー・終了。となるようにしたいです。 一応、各スレッドでSQLのエラーとなった場合には「catch」に飛んでる。状態ではあるのですが、aaa.java側に戻って終わらせる事が出来ず。。。 ソースはだいぶ削りましたが、参考に以下記載します。 (削りすぎている可能性もありますが、その際はごめんなさい。) すみませんが、よろしくお願いします。 ---------------------------------------- aaa.java   public void Sql_Exec() throws SQLException, IOException {     /*     ループ条件の取得。(省略)     */     //ループ処理。     for (ループ条件(省略)) {       //スレッドの呼び出し。       //スレッド1       Thread_1 exec_1 = new Thread_1(引数もろもろ);       Thread thr_1 = new Thread(exec_1);       thr_1.start();       //スレッド2       Thread_2 exec_2 = new Thread_2(引数もろもろ);       Thread thr_2 = new Thread(exec_2);       thr_2.start();       //スレッド3       Thread_3 exec_3 = new Thread_3(引数もろもろ);       Thread thr_3 = new Thread(exec_3);       thr_3.start();       try {         //全てのスレッドが終わるまで待つ。         thr_1.join();         thr_2.join();         thr_3.join();       } catch (InterruptedException e) {         //例外処理         e.printStackTrace();       }     }   } ---------------------------------------- スレッド1~3.java public class Thread_1 extends Thread{   public void run(){     /*     ループ条件の取得。(省略)     */          //ループ処理。     for (ループ条件(省略)) {       try (Connection con1 = DB接続。) {         String sql1 = 実行SQL取得;         PreparedStatement pstmt1 = con1.prepareStatement(sql1);         int aaa = pstmt1.executeUpdate();         con1.close();       } catch (SQLException | IOException | JAXBException e) {         e.printStackTrace();         throw new RuntimeException("例外!");       }     }   } } ----------------------------------------

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

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

    • ベストアンサー
    • Java
  • 再度、スレッドが実行中かどうかの確認

    一度質問したことですが、再度質問させていただきます。 過去の質問は以下です。 http://oshiete1.goo.ne.jp/qa5528714.html 過去の質問を参考に、以下のように実装しました。 public class TEST{  public boolean testMe(){   Runnable runnable = /* 省略 */;   Thread thread = new Thread(runnable);   boolean alive = thread.isAlive();   /* 必ずfalseになってしまう */   if(!alive){    thread.start();    return true;   }   return false;  } } public class TEST2 implements Runnable{  public void run(){   /* 処理 */  } } 上記の通りだと「thread.isAlive()」が必ずfalseで返ってきます。 また、Executorを利用した実装も試しました。 /* 処理を省略 */ ExecutorService executorService = Executors.newSingleThreadExecutor(); Runnable runnable = /* 省略 */; // シャットダウン結果 boolean exeShutdown = executorService.isShutdown(); /* 一度シャットダウンすると、ずっとtrueになってしまう */ if(!exeShutdown){  // 実行  executorService.execute(runnable);  // シャットダウン  executorService.shutdown(); } 一度は実行されるのですが、 その後は「executorService.isShutdown()」がtrueしか返しません。 なので、一度しか実行できません。 再度、知恵を貸していただければと思います。 よろしくお願い致します

    • ベストアンサー
    • Java
  • スレッド動かず

    本の真似をして、スレッドを書いてみたんですがに何も起こりませんでした。全く分かりません。どうすれば良いでしょうか? public class Frame1 extends Frame implements Runable{ ................. ................. Thread kick = new Thread(this); int time; public void start() { if (kick ==null) kick.start(); } public void run() { while (kick == Thread.currentThread()) { time++; String s = Integer.toString(time); textArea1.append( s + "\r\n"); try{ Thread.sleep(1000); }catch(InterruptedException e){} } }

    • ベストアンサー
    • Java
  • Threadに関するの質問

    このプログラムに synchronized , wait(), notify()を加えることで、 stackBody[]配列をオーバーやアンダーフローしないようにできるのでしょうか。お助け下さい! public class test { public static void main(String args[]) { Stack stack = new Stack(5); Pusher pusher = new Pusher(stack); Popper popper = new Popper(stack); pusher.start(); popper.start(); } } class Stack { private int stackSize; private int stackPointer; private int stackBody[]; public Stack(){ this(10); } public Stack(int size){ stackSize = size; stackBody = new int[size]; stackPointer = 0; } public void push(int value){ if(stackSize == stackPointer){ // } stackBody[stackPointer++] = value; } public int pop(){ if(stackPointer == 0){ // } return stackBody[--stackPointer]; } } class Pusher extends Thread { Stack s; public Pusher(Stack s) { this.s = s; } public void run() { int n, interval; for(int i = 0; i < 10; i ++) { n = (int)(100.0 * Math.random()); interval = (int)(100.0 * Math.random()); s.push(n); System.out.println("Pusher:" + n); try{ Thread.sleep(interval); }catch(InterruptedException e) {} } System.out.println("Push 終了"); } } class Popper extends Thread { Stack s; public Popper(Stack s) { this.s = s; } public void run(){ int n, interval; for(int i = 0; i < 10; i++){ interval = (int)(100.0 * Math.random()); n = s.pop(); System.out.println("Popper:" + n); try{ Thread.sleep(interval); }catch(InterruptedException e) {} } System.out.println("Popper 終了"); } }

    • ベストアンサー
    • Java
  • スレッドに関して(高橋麻奈の本)

    はじめまして。 現在、高橋麻奈の「やさしいJAVA」を読んで勉強している初心者です。 スレッドに関する記述(P.466)で分からない点があります。下記のコードを実行すると、  mainの処理をしています。  mainの処理をしています。  1号車の処理をしています。  mainの処理をしています。      ・ ・ の文字がアトランダムに並ぶとの事ですが、実行すると、  mainの処理をしています。  mainの処理をしています。  mainの処理をしています。  mainの処理をしています。  mainの処理をしています。  1号車の処理をしています。  1号車の処理をしています。  1号車の処理をしています。  1号車の処理をしています。  1号車の処理をしています。 と、アトランダムにならずに表示されてしまいますが、何故でしょうか?下記にコードを載せておきます。長くなって、申し訳有りません。 ---コード----------- class Car extends Thread { private String name; public Car(String nm) { name = nm; } public void run() { for(int i=0; i<5; i++){ System.out.println(name+"の処理をしています。"); } } } class Sample1 { public static void main(String args[]) { Car car1 = new Car("1号車"); car1.start(); for(int i=0; i<5; i++){ System.out.println("main()の処理をしています。"); } } }  

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

    お世話様です。 Windowsのスレッドについて質問です。(WinXP C#.NET2003) 以下のようなコードでスレッドを作成した場合、どうなるのか教えてください。 private void BTN_input_Click(object sender, System.EventArgs e) { Thread iwth = new Thread( new ThreadStart(InputWaitThread) ); iwth.Start(); } (1)iwthは動的に割り当てたのでBTN_input_Click関数内でのみ有効だと  思うのですが、BTN_input_Click関数を抜けてしまったあとは、  InputWaitThreadを実行するスレッドは  どういう位置づけになるのでしょうか?  (ゾンビプロセスですか?) (2)また、このコードを含むアプリケーションの終了時、  InputWaitThreadがまだ終了していない場合は、  強制的に終了されるのでしょうか? (3)InputWaitThreadが必ず終了するという保障がない場合には、  KILLしてやらなければいけないと思いますが、動的に割り当てたので  ハンドラがおらずKILLできませんが、どうすればいいのでしょうか?  (静的に割り当てておくしかないのでしょうか?) 以上、よろしくご教授願います。(@±@)

  • Threadの終了

    http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html を見ると,スレッドの止め方が書いてありますが, これは,スレッドblinker内でループが回っていて初めてうまく行く, と(間違ってるかもしれませんが)理解しています. では下記のように,Thread2でループが回っていない場合は (*)の位置でThread2を止めるにはどうすればいいのか, 教えてくださる方はいらっしゃいませんでしょうか. (**)のClassAではSWTでGUIを表示させていて, それをThread1から閉じるというのが目的です. GUIを閉じない限りその先には進まないので, ループを回しThread2のrun()内で待機させることが出来なくて. public class Thread1 { Thread1(){ Thread2 t2 = new Thread2(); t2.start(); try { Thread.sleep(5000); } catch (InterruptedException e) { } (*)ここでThread2を終了させたい. } public static void main(String args[]){ new Thread1(); } class Thread2 extends Thread { public void run() { new ClassA(); ・・・(**) } } }

    • ベストアンサー
    • Java
  • スレッド1とスレッド2を交互に実行するには?

    スレッド1→スレッド2→スレッド1・・・と同期を取り合いながら交互にスレッドを動かしたいのですが、Thread.getState()を用いないで実現するよい方法はないでしょうか? どうしてもデッドロックが発生しうる方法しか思いつかず困っています。 例えば以下のプログラムで1212と交互に表示させたい場合です。 以下のプログラムは当然デッドロックになりますが、やりたいことを伝えるために載せておきます。 Object obj; //スレッド間通信用のobject class Test1 extends Thread {  public void run() {   while(true) {    System.out.print("1");    synchronized (obj) {     obj.notify();//相手をnotifyして     obj.wait();//自分はwait    }   }  } } class Test2 extends Thread {  public void run() {   while(true) {    System.out.print("2");    synchronized (obj) {     obj.notify();     obj.wait();    }   }  } } new Test1().start(); new Test2().start();

    • ベストアンサー
    • Java

専門家に質問してみよう