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

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

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

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

Q&A

1回答

3866閲覧

時間のかかる処理での描画更新

uer03108

総合スコア194

Java

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

0グッド

1クリップ

投稿2017/10/03 14:54

下記の様な関数を呼び出した場合、全ての処理が終了した時点で処理1の描画更新が行われます。
これを処理1→処理2の順に行えるでしょうか。
run関数(?)を使うのですか?

java

1 2public void Sample(){ 3 4 //処理1 5 // Swing, JavaFx等でTextField, ImageView等を更新する 6 7 //処理2 8 // 時間のかかる処理 9 10}

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

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

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

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

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

guest

回答1

0

処理1→処理2の順に行えるでしょうか。

コード上は処理1→処理2の順に行っているわけなので、質問意図は「処理1の結果を画面にすぐに反映されるようにする」ですね?

まずGUIアプリケーションの基本的な考え方として、GUI用のスレッド(JavaFXではJavaFXアプリケーションスレッド、swingではEDT(Event Disptach Thread)で時間のかかる処理を行うこと自体が不適切と言えます。そういうことをしてしまうとご質問のような問題がどうしても起きますので、GUI用スレッドとは別のスレッドにて実行するのが常とう手段です。例えば処理2が数ミリ秒以上の処理なら、GUI用のスレッドとは別のスレッドで行うことを検討した方がよいと思います。

別スレッドでの実行ですが、処理2が実際にどういった類のものなのか(常に動かしたいものか、一時的に行うようなものか等々)によって具体的な方式は変わってきます。例えばBGMを自動再生するようなものであればアプリケーション起動時に専用のスレッドを起動するなんてことをやったりしますし、必要に応じてということならその都度スレッドを起動したりします。それが高頻度で行われるなら(スレッドの起動オーバーヘッドを緩和する目的で)スレッドプール機構を利用する手もあります。

長時間処理を別スレッドでやる方式にはいろいろと難しいトピックについても学ばねばならないのですが、とりあえずバックグラウンドで何かやるだけのコードは以下のような雰囲気になります。

java

1void updateAndDoSomething() { 2 // 処理1: GUI更新 3 textField.setText(...); 4 ... 5 // 処理2: 別スレッドで行う 6 Thread t = new Thread(() -> { 7 doLongProcessing(); // なにか時間がかかる処理 8 }); 9 t.setDaemon(true); 10 t.start(); 11}

処理2の途中や完了時のタイミングでGUIを更新したいケースもよくあります。そうした場合別スレッドからGUIスレッドに向けてスレッド間通知機構によりGUI関連処理を依頼する形になりますが、そうした場合にはswingではSwingUtilities#runLater、JavaFXではPlatform#runLaterなどが便利です。

上記は素朴にTheadを直接使った例ですが、高機能な並行処理用ライブラリーがいろいろあるので調べてみるとよいと思います。

投稿2017/10/03 16:00

KSwordOfHaste

総合スコア18394

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

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

uer03108

2017/10/04 04:58 編集

詳し回答有難うございました。 これは、並列処理の簡単なサンプルと言うことで宜しいのでしょうか。 今回のケース以外に、どの様な場合に有効なのか例を頂けると助かります。 「処理を独立して行う場合に必要だ」と言うことになるとは思いますが。 独立した処理は並列で行った方が、処理時間は短くなるのでしょうか。
KSwordOfHaste

2017/10/04 06:20 編集

> 並列処理の簡単なサンプルか? だと思います。 > どの様な場合に有効なのか 並列処理の目的には若干バリエーションがあります。いくつか例を挙げれば・・・ (A) リアルタイム性確保 今回の例がこれです。ユーザー操作などによるイベントに反応する処理(イベントハンドラーの処理)の理想は、人間が「待ち時間」を感じることのないような極短い時間(せいぜい数ミリ秒)で即座に反応することです。 (B) 計算機起源を限界まで使って計算速度向上 計算機には複数のプロセッサがあるので、それらを同時に動かすことで同じ時間内により多くの計算ができる場合があります。 (C) 論理の単純さ ある複雑な論理を単一スレッドで行うより、複数のスレッドで役割を分担するとより単純な論理で書けるといった利点があります。 > 独立した処理は並列で行った方が、処理時間は短くなるのでしょうか。 (B)に上げた通りうまくやれば短くできます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問