Depending on exactly what your process is, you might not need to do threading (Which, trust me, is something that you'd rather avoid if at all possible, no matter how cool and fun the big kids make it out to be).
One way to approach the problem is to set up an event queue.
in pseudocode
enum EVENTTYPES = {PEEL=0, WORK=1};
struct Event = {
int eventType;
int* data;
}
filoQueue eventQueue;
array sQuidPlayers = [new Squid(), new Squid(), new Squid()];
void eventLoop () {
int player;
for each player in sQuidPlayers {
eventQueue.push(new Event(EVENTTYPES.WORK, player.id));
}
for each event in eventQueue {
game.doEvent(event)
}
}
So here you run the event loop 25 times, 30 times, or 60 times per second, whatever frame rate you want to operate at. You use a timer for that (i'm sure there's one in java somewhere)
Then doEvent will try and look up some cooresponding method on the cooresponding player instance. The work method on the Squid class will do some tiny parcel of work, and then stop, waiting for the next time around in the loop. Each Squid in the array gets their turn to do their tiny bit of work. The work method, in turn, MAY put a PEEL event onto the event queue. At that point, next time around the loop, some cooresponding peel method may be called. Perhaps on some central game class, with the id of the player that originated the peel event. You put the logic of how to dispatch these events into the doEvent method there. doEvent in turn can pass in an object to each event reciever, so that the reciever can put their own event objects onto the queue to be run next time around the loop. (alternately, the "for each event" loop runs until the eventqueue is empty, and that includes new events just added by previous calls to doEvent, so a new event can get called immediately instead of waiting for the next frame of animation)
The trick is figuring out how to break your long running work into a tiny parcel of work, figure out how to save the results of that work, and pick it up later where you left off the next time the work method is called. If all the players are well behaved, they can all share a thread without getting stuck.
If you're going to go down the threaded path, the issues about who can access what bit of memory and when get a little bit more complicated.