FileInputStreamCache leaves around a reference to its cacheCleaner after close().
The cacheCleaner is created like this:
and supposedly removed like this:
However, ScheduledThreadPoolExecutor.remove returns a success boolean which should be checked. And I think from a quick read of that class that the return value of scheduleAtFixedRate should be used as the argument to remove.