A little while ago, there was a requirement to write a tool that could take a number of tasks each with a set of dependencies and execute them in parallel while taking the dependencies into account.
The tasks themselves were meant for data migration but that is not particularly relevant. We were writing a number of tasks which all had a set of dependencies (some of the tasks did not have any dependencies or the process could of course never start).
It was assumed that there were no cyclic dependencies (which would be error in this particular case anyway)
Bearing in mind that this was a quick and dirty tool for use three times, some of the bits in here could do with tidying up.
Each task was defined to implement the following interface
public interface Task extends Runnable {
public String getName();
public Set getDependencies();
}
It should all be self explanatory. Extending the Runnable interface ensure that we can pass it into threads and other relevant bits of code. The getDependencies is expected to return the name of the tasks that it depends on.
The basic task runner which I describe below does not check if the task described in any list of dependencies actually exist. If an non-existing dependency is defined, it will likely just throw a Null Pointer Exception. I wrote this a long time ago, so don’t actually remember.
Continue reading →