私はrun()
メソッドでプライベート揮発性ダブル値を更新し続けるRunnable "NanoClock
"クラスを持っています。Java:揮発性変数が更新されない(getおよびsetメソッドが機能しない)
このクラスには、double値を返すgetTime()
メソッドもあります。別のクラス( "Master
")はNanoClock
クラスを構築しており、スレッドを作成し、start()
メソッドを呼び出す。
これを実行した後、getTime()
メソッドを何回か(遅れて)呼び出しますが、値は更新されません。私は間違って何をしていますか?
NanoClock.java:
public class NanoClock implements Runnable {
private volatile boolean running;
private volatile double time;
public NanoClock() {
time = System.currentTimeMillis();
}
@Override
public void run() {
running = true;
while(running) {
try {
if(System.currentTimeMillis() > time) {
time = System.currentTimeMillis();
}
//This returns the updated value continuously when commented out
//System.out.println("Time: " + String.format("%.6f", unix_time));
Thread.sleep(2000);
} catch(Exception exc) {
exc.printStackTrace();
System.exit(1);
}
}
}
public double getTime() {
return time;
}
public void end() {
running = false;
}
}
Master.java:
public class Master {
public static void main(String[] args) {
try {
NanoClock nClock = new NanoClock();
Thread clockThread = new Thread(new NanoClock());
clockThread.setPriority(10);
clockThread.start();
//MY_ISSUE: This returns the same value every time
for(int a = 0; a < 10; a++) {
System.out.println("Time: " + nClock.getTime());
}
//MY_ISSUE: This cannot stop the while loop - I tested it with
//the println in the NanoClock class.
nClock.end();
System.out.println("Done!");
catch(Exception e) {
e.printStackTrace();
System.exit(1);
}
}
}
runメソッド内で常にrunningをtrueに設定するので、whileループは決して止まらないでしょう... – home
'new NanoClock()'はどういう意見がありますか? –
@homeしかし、runメソッドは一度だけ呼び出されます。だから私は実行の値をfalseに変更するまでメソッドを終了し、スレッドを終了する結果を変更するまでwhileループ内にとどまるはずです...またはrunメソッド自体が連続して呼び出されていますか? @SotiriosDelimanolis私は 'new NanoClock()'がクラスコンストラクタを呼び出し、objetのインスタンスを作成してスレッドに変換できると考えました。私はこの練習をすでに何度か見てきました...それに何か問題がありますか? – AlpayY