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

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

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

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

Q&A

1回答

6880閲覧

スレッド終了する前にメインのスレッドが終了すると何が起きるのでしょうか

toroleaman

総合スコア95

Java

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

0グッド

0クリップ

投稿2015/10/29 17:00

スレッドが終了する前にメインスレッドが終了した場合、どのような問題が発生するのか知りたいです。

処理の流れとしては、
メインスレッドA起動
初期処理
スレッドB起動
・スレッドBの処理(他のサーバに接続してデータ検索する処理)
スレッドBの処理がタイムアウトする。
終了処理
メインスレッドA終了

となります。

メインスレッドが終了した後にスレッドBのレスポンスが帰ってきたときには、スレッドAは終了しているので、何かExceptionが発生するのでしょうか。
対策として、スレッドBのレスポンスが帰ってきたときには、
スレッドAのリソースには、何もせずに、スレッドBの処理が終了するように制御を入れようと思っていますが、
そもそも、お作法として終了を待つ必要があるのか知りたいです。

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

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

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

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

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

guest

回答1

0

スレッドAで、スレッドBの結果を知りたいのでなければ、
スレッドBの終了を待つ必要はありません。
スレッドAが先に終了しても、特に例外も発生しません。

GUIのプログラムなどで、
メインスレッドから描画用のスレッドを起動して後の処理を任せ、
メインスレッドは終了してしまうようなことも
よくあるので、終了を待つことは必須ではありません。

ただ、スレッドBをデーモンスレッドとして起動してしまうと、
スレッドA終了時に即座にプロセス終了してしまうので、
スレッドBの処理は中断してしまいます。
デフォルトではデーモンスレッドではないスレッドとして起動するので、
意識せずにデーモンスレッドにしてしまうことは
あまり無いとは思いますが。

デーモンスレッドについては、
javaのデーモンスレッドとは何ですか(592)|teratail
に説明があります。

投稿2015/10/29 23:14

eripong

総合スコア1546

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

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

toroleaman

2015/10/30 16:13

そうです。デーモンスレッドとして起動した場合、スレッドBの処理が中断すると、 リソースのクローズは行われないということでしょうか。 通信中にクローズした場合、ソケットの開放漏れやファイルのクローズ漏れなどの 問題が発生しないか懸念しています。 スレッドBは、ライブラリのある関数を呼んでいるので、 実際、スレッドBが中断した場合、どのような挙動になるのか 不明です。
eripong

2015/10/30 22:15

リソースはきちんとクローズされます。 プロセスの終了処理は行われるからです。
eripong

2015/10/30 22:49

もう少し詳細にいうと、Javaがどのように終了しようと、 OSのプロセス終了処理は行われるので、ファイルやソケットなど、 OSによって管理されるものは、OSによってクローズされるので大丈夫です。 それ以外、Javaアプリケーションとしての終了処理、 例えばfinallyに書いた内容や、finalizeメソッドに書いた処理は、 実行されることは保証されません。 そのため、DBに対するロールバックやコミットなどが行われない可能性はあります。 ShutdownHookを用いることで、終了時の処理を追加できますが、 アプリケーションとして終了処理が必要な場合は、 デーモンスレッドは避けた方がよいかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問