質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

解決済

4回答

2800閲覧

マルチスレッドで全てを同時開始させて全てが終わるまで待機させたい。

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

1クリップ

投稿2021/09/02 08:36

編集2021/09/03 04:35

###やりたい事
マルチスレッドを使って全てのスレッドを同時に実行して全てのスレッドが終了するまで待機する処理を作りたです。

###コード内容
pdfの複数のディレクトリをマルチスレッドで処理するコード

###現状
提示コードの下部の//////コメント部内部のコードですが.join()関数を使って終了するまで待機していますがこのやり方だと
スレッドA,BがあるとしてAが実行してAが終了するまでBの処理が始まらず。結果的にAの次がB という感じで
順番に処理されていまいす。
現在はThreadクラスを継承させて行っています。*

###質問内容
上記のやりたい事を実現するにはどういった手法を行えばいいのでしょうか?Threadクラスを継承するやり方だと現状のようなやりかたになってしまいます。

###参考サイト
参考サイトA: https://qiita.com/yacchi1123/items/d89edbaf681a630d4343
Github: https://github.com/Shigurechan/PDFConverter


java

1import java.io.File; 2 3import java.util.ArrayList; 4import java.util.List; 5import java.util.Scanner; 6 7public class Main 8{ 9 public static void main(String args[]) 10 { 11 Scanner scanner = new Scanner(System.in); 12 List<Converter> dirList = new ArrayList<>(); //ディレクトリ 13 List<ConverterPage> pageList = new ArrayList<>(); //ページ 14 15 System.out.println("windows: Cntrl + z 開始"); 16 System.out.println("linux: Cntrl + D 開始\n"); 17 18 19 int i = 0; //表示用 20 while(true) 21 { 22 23 System.out.print("\nDirectory or File > "); 24 25 if(scanner.hasNextLine() == false) 26 { 27 break; 28 } 29 30 31 32 String fileName = scanner.nextLine(); 33 System.out.println(fileName); 34 35 File file = new File(fileName); 36 37 //System.out.println(file.getName().substring(file.getName().lastIndexOf("."))); 38 39 System.out.println(" " + i + " >: " + fileName); 40 41 //ファイルかディレクトリかを選別 42 if(file.exists() == true) 43 { 44 if(file.isFile() == true) 45 { 46 String extension = file.getName().substring(file.getName().lastIndexOf(".")); 47 48 if(extension.equals(".png") || extension.equals(".jpg") || extension.equals(".jpeg")) 49 { 50 pageList.add(new ConverterPage(fileName)); 51 } 52 } 53 else 54 { 55 dirList.add(new Converter(fileName)); 56 } 57 } 58 else 59 { 60 System.out.println("対応形式ではりません: " + file.getName()); 61 } 62 63 i++; 64 } 65 66 67 //ディレクトリ 68 if(dirList.size() > 0) 69 { 70 for(Converter con : dirList) 71 { 72 con.start(); 73 } 74 75 } 76 77 //ファイル 78 if(pageList.size() > 0) 79 { 80 for(ConverterPage con : pageList) 81 { 82 con.start(); 83 } 84 } 85 86 long startTime = System.currentTimeMillis(); //開始時間 87 88 89 try 90 { 91////////////////////////////////////////////////////////////////////////////////////////////// 92 for(Converter con : dirList) 93 { 94 con.join(); 95 } 96////////////////////////////////////////////////////////////////////////////////////////////// 97 for(ConverterPage con : pageList) 98 { 99 con.join(); 100 } 101 } 102 catch(InterruptedException e) 103 { 104 e.printStackTrace(); 105 } 106 107 108 scanner.close(); //scanner close 109 110 long endTime = System.currentTimeMillis(); //終了時間 111 System.out.println("終了: " + (endTime - startTime)); 112 } 113} 114 115

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2021/09/02 14:25 編集

> 1番が終了するまで2番が実行されないという状態です 1番 2番 とはなんのことでしょうか。通じてないのので質問を編集して補足してもらえればと思いました。 また、"1番が終了するまで2番が実行されない"というのは、どう確認して、何を以て判断したのでしょうか。
cretter

2021/09/03 02:47

>*現在はThreadクラスを継承させて行っています。** と言っていますがこのソースコードは最新のものですか? ソースコードを見たところ特に間違いは見つけられないのでThreadを継承したクラスのソースコードも乗っけてくれるとありがたいです。
dodox86

2021/09/03 03:30

例えば10個のスレッドがあって、それぞれをひとつのループでjoinで待つようにした場合、1つのjoin待ちでブロックしてしまうけど、スレッドが終わったらjoinから抜けてくるわけで、最終的には10個全部終了するまで待機するかたちになるので質問にある要望は満たせるはず。回答を既にいただいていて、その後に質問が編集されているので満足されていないようですが、本当にやりたいことがどうもよく分からない質問ですね。
quickquip

2021/09/03 04:21

> 順番に実行されてしまい が伝わりません。 これは何かを確認した結果の「質問者さんの解釈」です。 回答者側が欲しいのは質問者さんの解釈ではなくて、"なにをどう確認したのか?"という情報と、それを見て"質問者さんがどう考えて"その解釈に至ったのか? ということです。 それがないと回答ができません(正しくは"回答ができない場合もある"でしょうが、今回はそのケースに当てはまる可能性が高いと感じています)。 > やりたいこととは違います の"やりたいこと"も伝わってないです。想像はできますが、こういうことがしたいんだろうな程度のものです。
退会済みユーザー

退会済みユーザー

2021/09/03 04:34 編集

なるほどわかりました。
Zuishin

2021/09/03 05:15

なるほどわかりました(何を言われたんだろう????)
quickquip

2021/09/03 07:21 編集

> Aが実行してAが終了するまでBの処理が始まらず それをどうやって確認したんですか? ということが知りたかった。(けっきょく「なにも確認してないのに妄想的に思い込んでただけ」が正解?)
guest

回答4

0

ベストアンサー

con.start() , con.join() の後にそれぞれ何かしら文字列を出力してみてください。

java

1con.start(); 2System.out.println("dir start: " + con.getName()); 3 4con.join(); 5System.out.println("dir end: " + con.getName()); 6

直列実行しているのならば start, end が交互に表示されるはずです。

思い込みで考えるのではなく、実際の挙動を確認するようにしましょう。

投稿2021/09/03 02:55

mather

総合スコア6759

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/09/03 04:20

なるほど以下のうに実行したらコンストラクタの第一引数は待機するミリ秒です。 ```java test a = new test(41,"aaa"); test b = new test(10,"bbb"); test c = new test(5,"cc"); c.start(); a.start(); b.start(); a.join(); b.join(); c.join(); ``` 「実行結果」 cc bbb aaa と表示されました これは”全てのスレッドを同時に開始させて最後が終わるまで待機する”という処理になっているるのでしょうか?
mather

2021/09/03 05:02

「出来ていますか?」と毎回他人に確認するのではなく「期待通りか期待通りでないか」を自分自身で考えてください。 逆に聞きますが、不安に感じる部分はありますか?
退会済みユーザー

退会済みユーザー

2021/09/03 05:08

なんとなく不安なので聞きたくなってしまいました。すいません。確認したかったです。
mather

2021/09/03 05:24

責めているわけではありません。 「なんとなく不安」をもっと具体的に表現しない限り、あなた自身の不安を解消する回答は得られません。 誰かに「正解です」と言ってもらわないと不安だと思うなら、どうやったら「正しく動作した」と確認できるかを考えてみてください。
guest

0

一斉start・順にjoin で納得されなければ、 CountDownLatch
もあります。

投稿2021/09/03 05:41

jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

おそらく読まれないとはおもいますが、大量にスレッドを起動するのであれば、java.util.concurrentの参照と利用をおすすめしておきます。

投稿2021/09/03 04:49

shiketa

総合スコア4061

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Threadクラスについて調べてみてはどうでしょうか。
Threadjoin()が役に立つかと。
参考にできそうなURLです

上の回答は間違いです。
少し待っててください。

joinをまとめたクラスをもう一つ作るのはどうでしょうか。そのクラスをThreadを使ってjoinをすればそのクラス内の処理がすべて終わってからなので間違いは起きないかと。

投稿2021/09/03 02:07

編集2021/09/03 03:07
cretter

総合スコア91

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問