みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

javaのスレッドの割込みについて

javaのスレッド割込みに関する初心者の質問です。
割込みの発生元でCNTに値を設定し、割込みの受信元でCNTの値を読込み、表示しています。
下記のコードを参照ください。

Q1)CNTの値の設定と読込みで競合が発生する様なことはありませんか?
又は、処理が停滞するとか

以上、お手数をお掛けしますが、宜しくお願いします。

//割り込を発生するスレッド
class threadA extends base{
private Thread target;
public threadA(Thread targetA){
target = targetA;
}
public void run(){
for(int i = 0; i < 8;i++){
try{
System.out.print(".");
Thread.sleep(1);
CNT=i;
target.interrupt();
}catch(InterruptedException e){
System.out.println("今割り込まれました: thread");
}
}
}
}

//スレッドからの割り込みを受信するルーチン
class Sample108{
public static void main(String args[]){
//for(int i=0; i<2; i++){
classA obj = new classA();
obj.threadStart();//割り込みを受けるルーチン、この中で、割り込みを発生するルーチンを起動している
//}
}
}

//割り込みを受けるルーチン
class classA extends base{
void threadStart(){
System.out.println("Start: main****");
threadA obj = new threadA(Thread.currentThread());
obj.start(); //Thread起動
//mainのルーチン
for(int j = 0;j < 20; j++){
try{
Thread.sleep(1);
System.out.print("*");
}catch(InterruptedException e){
System.out.println("今割り込まれました: classA CNT="+CNT);
}
}
}
}
以上

投稿日時 - 2015-05-29 10:16:35

QNo.8984378

困ってます

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

CNT に volatile 修飾子が付いていない場合は誤った値が表示される可能性が有るかと。
マルチスレッド環境下でのフィールドの可視性の問題です。

各スレッドはフィールド値のキャッシュを持つ事が出来るので、synchronized ブロック内か volatile の付いたフィールド以外は、他のスレッドでの書き込まれた最新の値が見える保障はありません。

http://www.ne.jp/asahi/hishidama/home/tech/java/thread.html#h2_volatile
http://www.ibm.com/developerworks/jp/java/library/j-jtp06197.html

投稿日時 - 2015-05-31 01:07:45

ANo.4

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

>CNTはbaseクラスの中に下記の如く定義されています。
>class base extends Thread{
>public static CNT=0;
>}

あの、「タイプは何ですか」と訊いたんですが(苦笑)。まぁ、public static int CNT=0; と勝手に判断させてもらいましょう。ならプリミティブタイプですから競合による問題は発生しないはずです。

投稿日時 - 2015-05-30 21:43:59

ANo.2

先に回答されている方が書いている通り、CNTは何なのでしょうか。どこにも宣言文がないのですが。

見たところ、ごく普通のint値であるように思えるのですが、Javaではプリミティブタイプはスレッドセーフなので、intなら競合による問題が発生することはないでしょう。が、CNTがインスタンスなら、そのクラスがどう定義されているかによって違ってきます。例えばイミュータブルなクラスなら問題は発生しないはずですがそうでないなら設計次第で競合による問題は発生する可能性があるでしょう。

投稿日時 - 2015-05-30 10:28:51

補足

shylockさま
御免なさい。
CNTはbaseクラスの中に下記の如く定義されています。
class base extends Thread{
public static CNT=0;
}

投稿日時 - 2015-05-30 14:23:51

ANo.1

処理の概要がイマイチ掴めません。まずCNTの宣言の記載がないですし、interruptはInterruptedExceptionを必ず発生するものでもないので、CNTを出力したいタイミングがよくわかりません。また、競合とは何を意味していますか?

投稿日時 - 2015-05-29 17:32:00

補足

y_shimizu さま
回答有難うございます。
>処理の概要がイマイチ掴めません。
<---//割り込を発生するスレッド以下のコードを参照願います、またはPCでrunすれば
ご理解できるのでは無いかと思います。

以上、宜しくお願いします。

投稿日時 - 2015-05-29 19:31:41