0
マルチスレッド実行時の挙動がMacとWinで違う?
初めまして、マルコムXです。
マルチスレッドの実行の勉強として下記の様なサンプルコードを作りました。
RuntimeTestクラスのスレッドと
ParallelClassクラスのスレッドが並行で動くというものです。
ParallelClassのwhile文でiが150000を超えると
RuntimeTestのwhile文は処理を抜け、ParallelClassを止めるという動作を想定しています。
しかし、
下記のRuntimeTestクラスのmainメソッド内でwhile文から抜けるハズの条件が認識されない状態となってしまい、いつまで経っても処理を抜けることができません。
そこでRuntimeTestのwhile文内でthread.sleep(10);を入れてwhileが回る速度を落とすと意図した通りに処理を抜けるようになりました。
windowsで同様のプログラムを実行した場合sleepを入れなくても上手く動きました。
sleepを入れないとwhileの条件が上手く認識できないのは何故なのでしょうか?
また、windowsでは上手く動くというのは何故なのでしょうか?
さっぱり解らず困っています。
どなたか何卒宜しくお願いいたします。
____________________________________
使用しているMacの環境は以下です。
(winは知り合いに頼んで実行してもらったので解りません)
・MacOS10.6.8
・java version 1.6.0_26
・統合開発環境 Eclipse3.7
____________________________________
__RuntimeTest.java___________________________
public class RuntimeTest {
/**
* @param args
*/
public static void main(String[] args) {
// 並行処理を行うクラスのインスタンスを生成
ParallelClass pc = new ParallelClass();
// スレッドを作成
Thread t = new Thread(pc);
// ParallelClassのrunメソッド実行
t.start();
String name = null;
while ((name = pc.getFilename()) == null) {
//Q : sleep()でwhileが回る速度を調整
//Q : sleep処理をなくすとwhile文を抜けないのは何故?
/*
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
*/
}
//ParallelClassのwhile文でiの値が150000になったらflagを立てる
pc.setFlag(true);
System.out.println("ファイル名:"+pc.getFilename());
}
}
__ParallelClass.java_________________________
import java.util.*;
public class ParallelClass implements Runnable {
private String filename;
private boolean flag = false;
public void run() {
// Scanner scan = new Scanner(System.in);
int i = 0;
while (true) {
System.out.println("parallel回転中!"+i);
if (i == 150000) {
this.filename = "test.csv";
}
i++;
if(this.flag == true){
break;
}
}
System.out.println("終わり");
}
public String getFilename() {
return filename;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}