The code below is to emulate a robotics simulator I'm working with. I'm not entirely sure why this doesn't work - I'm not very familiar with threads and even though I've tried reading plenty today, I don't seem to be making progress. The problem is that once pauseDistanceSensor() is called, it never wakes up.
import java.util.Random;
public class TestThreads
{
private DistanceSensor dist;
private Thread distanceThread;
public TestThreads()
{
this.dist = new DistanceSensor();
this.distanceThread = new Thread(this.dist);
this.distanceThread.start();
}
public int getDistance()
{
return this.dist.getMeasurement();
}
public void pauseDistanceSensor()
{
synchronized(this.dist)
{
try {
this.dist.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void resumeDistanceSensor()
{
synchronized(this.dist)
{
this.dist.notify();
}
}
public static void main(String[] args)
{
TestThreads test = new TestThreads();
long timestamp = System.currentTimeMillis();
System.out.println("Starting at "+timestamp);
System.out.println("1: "+test.getDistance());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("2: "+test.getDistance());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("waiting distance sensor and making 3 getDistance calls then sleeping main thread for 1 second - all 3 getDistance calls should be printed when the sleep ends");
test.pauseDistanceSensor();
System.out.println("3: "+test.getDistance());
System.out.println("4: "+test.getDistance());
System.out.println("5: "+test.getDistance());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Alive! Notifying the thread");
test.resumeDistanceSensor();
System.out.println("Done at "+System.currentTimeMillis());
}
}
class DistanceSensor implements Runnable
{
private final Random gen = new Random(54);
private int currentVal;
public DistanceSensor()
{
this.currentVal = this.gen.nextInt(1500);
}
public void run()
{
this.currentVal = this.gen.nextInt(1500);
}
public int getMeasurement()
{
return this.currentVal;
}
}