@zsxwing -- Seems I didn't understand the implications of a sleep like this. I've taken the suggestions of @akarnokd and used an Executor, but not the GenericScheduledExecutorService, just a ScheduledExecutorService. The behaviour is now correct and, from your example, action2 will run in 2 seconds.

My current problem is Unit testing and I'm not sure how to overcome it, so I'd welcome any suggestions. As it stands there's no support for unit testing other than hacking together a CLI application, which calls your tests. Similar to this:

```
public class RoboVMTestRunner {
    public static void main(String[] args) {
            JUnitCore jUnitCore = new JUnitCore();
            jUnitCore.addListener(new TextListener(System.err));
            jUnitCore.run(IOSThreadSchedulerTest.class);
    }
}
```

This is all well and good, but it does little for 'automated' testing as it can't be called properly from ant, maven or gradle because it doesn't return the test results.