Futures are high-level primitives for asynchronous or synchronous (deferred) computations. They can be used when the main thread waits for results of a computation that runs possibly in a separate thread, and are as such not a replacement for threads in general. In particular, they're not directly applicable to scenarios where a second thread is running all the time, such as in this example.
I totally agree with Jesper Juhl concerning the complexity of multithreading as well as premature optimization. A lot of multithreading beginners have the impression that multiple threads would magically make things faster and solve their problems that are in fact none. There are cases where threads are appropriate, and these are mainly operations that would otherwise block the main thread and make the application unresponsive, such as networking, long-lasting resource loading or similar.
Game logic in itself does not necessarily require threads. You should design your code in a modular way that would allow to easily embed threads at a later stage. Important points to consider here are that you program modularly, reduce inter-dependencies between modules to an absolute minimum, and avoid global and static variables at all cost. In multithreaded programs, a challenge is synchronization, and you'll want to keep interfaces small. But the mentioned points are also highly beneficial for single-threaded programs.