Atom vs RSS
For instance, my blog is available in RSS at:
http://feeds.feedburner.com/DavidKempsBlog
public interface Temperature {
double getCelciusValue();
double getFahrenheitValue();
}
public interface WeatherService {
Temperature getTemperature();
}
WeatherService melb = new RemoteWeatherService("Melbourne");
WeatherService sydney = new RemoteWeatherService("Sydney");
WeatherService brisbane = new RemoteWeatherService("Brisbane");
Temperature melbTemperature = melb.getTemperature();
Temperature sydneyTemperature = sydney.getTemperature();
Temperature brisbaneTemperature = brisbane.getTemperature();
System.out.println("City\t\tTemperature");
System.out.println("Melbourne\t" + melbTemperature.getCelciusValue());
System.out.println("Sydney\t\t" + sydneyTemperature.getCelciusValue());
System.out.println("Brisbane\t" + brisbaneTemperature.getCelciusValue());
// NOTE: Specifying a 10 second time out. This is discussed later.
WeatherService melb = new AsynchWeatherService("Melbourne", 10, TimeUnit.SECONDS);
WeatherService sydney = new AsynchWeatherService("Sydney", 10, TimeUnit.SECONDS);
WeatherService brisbane = new AsynchWeatherService("Brisbane", 10, TimeUnit.SECONDS);
Temperature melbTemperature = melb.getTemperature();
Temperature sydneyTemperature = sydney.getTemperature();
Temperature brisbaneTemperature = brisbane.getTemperature();
System.out.println("City\t\tTemperature");
System.out.println("Melbourne\t" + melbTemperature.getCelciusValue());
System.out.println("Sydney\t\t" + sydneyTemperature.getCelciusValue());
System.out.println("Brisbane\t" + brisbaneTemperature.getCelciusValue());
public class AsynchWeatherService implements WeatherService {
private RemoteWeatherService weatherStation;
private final long timeout;
private final TimeUnit timeoutUnit;
public AsynchWeatherService(String city, long timeout, TimeUnit timeoutUnit) {
this.weatherStation = new RemoteWeatherService(city);
this.timeout = timeout;
this.timeoutUnit = timeoutUnit;
}
public Temperature getTemperature() {
FutureTask<Temperature> result = new FutureTask<Temperature>(
new Callable<Temperature>() {
public Temperature call() {
return weatherStation.getTemperature();
}
});
new Thread(result).start();
return new FutureTemperature(result, timeout, timeoutUnit);
}
}
public final class FutureTemperature implements Temperature {
private final Future<Temperature> futureTemperature;
private final long timeout;
private final TimeUnit timeoutUnit;
public FutureTemperature(Future<Temperature> futureTemperature, long timeout, TimeUnit timeoutUnit) {
this.futureTemperature = futureTemperature;
this.timeout = timeout;
this.timeoutUnit = timeoutUnit;
}
public double getCelciusValue() {
return getFutureTemperature().getCelciusValue();
}
public double getFahrenheitValue() {
return getFutureTemperature().getFahrenheitValue();
}
private Temperature getFutureTemperature() {
// TODO: Should give more thought to exceptions!
try {
return futureTemperature.get(timeout, timeoutUnit);
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (ExecutionException e) {
throw new RuntimeException(e);
} catch (TimeoutException e) {
throw new RuntimeException(e);
}
}
}
final EventualValue<Integer> ev = new EventualValue<Integer>();
new Thread(){
public void run(){
ev.set(3 + 4);
}
}.start();
new Thread(){
public void run(){
ev.set(3 + 6);
}
}.start();
System.out.println(ev.get());
Thread.sleep(500);
System.out.println(ev.get());
public interface Future<V> {
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
public interface Callable<V> {
V call() throws Exception;
}
public class TemperatureRequest implements Callable<Float> {
private RemoteWeatherStation weatherStation;
public TemperatureRequest(RemoteWeatherStation weatherStation) {
this.weatherStation = weatherStation;
}
public Float call() throws Exception {
return weatherStation.getTemperature();
}
}
FutureTask<Float> result = new FutureTask<Float>(new TemperatureRequest(weatherStation));
public Future<Float> getTemperature() {
FutureTask<Float> result = new FutureTask<Float>(new TemperatureRequest(weatherStation));
new Thread(result).start();
return result;
}
public class WeatherService {
.....
public EventualValuegetTemperature() {
final EventualValueresult = new EventualValue ();
new Thread() {
public void run() {
result.set(remoteWeatherStation.getTemperature());
}
}.start();
return result;
}
}
WeatherService melb = new WeatherService("Melbourne");
WeatherService sydney = new WeatherService("Sydney");
WeatherService brisbane = new WeatherService("Brisbane");
EventualValue<Float> melbTemperature = melb.getTemperature();
EventualValue<Float> sydneyTemperature = sydney.getTemperature();
EventualValue<Float> brisbaneTemperature = brisbane.getTemperature();
System.out.println("City\t\tTemperature");
System.out.println("Melbourne\t" + melbTemperature.get());
System.out.println("Sydney\t\t" + sydneyTemperature.get());
System.out.println("Brisbane\t" + brisbaneTemperature.get());
public class EventualValue<T> {
private T value;
private boolean ready = false;
public synchronized void set(T value) {
this.value = value;
ready = true;
notifyAll();
}
public synchronized T get() throws InterruptedException {
while (!ready) {
wait();
}
return value;
}
}