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

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

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

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

Q&A

解決済

3回答

1603閲覧

スレッドの現在位置のようなもの

snow_wind

総合スコア9

Java

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

0グッド

0クリップ

投稿2015/11/21 10:27

初投稿です。Javaの勉強をしはじめました。
曖昧な質問ですが、プログラムが走っている間、スレッドは常にどこかのオブジェクトにいる、と考えてよいでしょうか。
私の今の勝手なイメージではスレッドはオブジェクトからオブジェクトへ渡り歩いていく。(まだよく分からないですが、staticメソッド内や静的初期化ブロックにいるときなんかはロードしたときに作られたクラスオブジェクト?が現在位置と考える)。別のオブジェクトの変数を参照したりメソッドを起動したり、あるいは新たなオブジェクトを生成できるかは現在位置と対象の変数、メソッド、コンストラクタのアクセス修飾子の何如のみから決定される。
混乱してますが、上のイメージにまずい部分はありますか?

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

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

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

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

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

guest

回答3

0

プログラムが走っている間、スレッドは常にどこかのオブジェクトにいる、と考えてよいでしょうか。

「どこかのオブジェクトにいる」も完全に外している訳ではない気がしますが、もうちょっと詳細化すると「プログラム(ソースコード)のどこかの命令(行)を処理中」と捉えた方がよいでしょう。デバッガ上でのステップ実行によるデバッグ作業の経験があれば、そのイメージをつかみやすいかと思います。

投稿2015/11/22 03:29

yohhoy

総合スコア6189

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

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

snow_wind

2015/11/23 07:21

ご回答ありがとうございます。なるほど、まだ始めたばかりでデバッガを利用したことはないですが、スレッドはいつもある処理単位上にいる、というイメージをそこでは持つのですね。
guest

0

ベストアンサー

そもそもアクセス修飾子によるアクセスの可否はコンパイル時に決定されます。
参照先の変数やメソッドが他クラスのprivateなメンバであった場合などは、
コンパイルの時点でエラーになります。
なので、最初からそのような「命令書」を書くことはできません。
スレッドは完成したその「命令書」通りの処理をするだけです。
なので「スレッドがオブジェクトに居る」という表現は誤りで、スレッドは命令書を読んでオブジェクトを見て、そのとおりに処理をしているだけなのです。

ちなみに:
threadは「糸、道筋、脈略」という意味があります。

投稿2015/11/21 15:47

編集2015/11/21 15:52
swordone

総合スコア20649

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

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

snow_wind

2015/11/21 16:11

一行目で私の考え違いがパっと照らされました。コンパイル時と実行時がまさにごっちゃになっていました。「アクセス修飾子違反」というのは、コンパイル時にすでに判明するんですね。すると、アクセス修飾子というのは、コンパイル成功後はもうないものと思ってよろしいでしょうか?
swordone

2015/11/21 16:21

そうですね。コンパイルが通ったということは、種々のアクセスのセキュリティに問題がないということになるので、コンパイル成功後はアクセス修飾子はほぼ関係なくなるでしょう。 変わってくるのは、Javaの標準ライブラリのように、クラスを外部に公開する場合になると思われます。
snow_wind

2015/11/23 07:22

とてもよく分かりました。ありがとうございました。
guest

0

スレッドがオブジェクトを参照して、いろいろ処理をするというのが正しいです。そういう意味ではオブジェクトにいるというより、オブジェクトを参照したり書き換えたりしているのがスレッドです。スレッドが人で、オブジェクトがノートというたとえがいいかもしれません。

JavaでもPHPでも参照されなくなったオブジェクトはGCによって解放されますが、スレッドを立ち上げるのも、オブジェクトを参照する手伝いをするインスタンス変数を作るのもメモリを消費しますので、意識してコーディングする必要があります。

投稿2015/11/21 10:37

tixure55

総合スコア400

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

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

snow_wind

2015/11/21 15:26

ご回答ありがとうございます。 なるほど、、。このイメージの中で私がすっきりさせたいのは、ある瞬間にスレッドがアクセス可能な範囲、のようなものです。たとえばスレッドがクラスAのインスタンスに「いたら」、クラスBのprivateな変数を参照できない、というような。 スレッドが「人」の場合でも、各瞬間にその「人」が持っている属性のようなものって列挙できるでしょうか。その中に、上の例でいうなら「クラスAのあるインスタンス」を値に持つなんらかの属性があって、その属性が現在そうであるがゆえに「クラスBのprivate変数を参照できない」という捉え方をして問題ないだろうか、という感じです。 何を言っているのやらという感じかもしれませんが、なにかお応えいただけたらうれしいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問