ThreadDeath problem and large amount of skipped turns
It does not look that item 5 is performed the way which would be reasonable (i.e. how you describe).
Have a look checkSkippedTurn() where decision about penalty is done (I believe it is actually your code :). It does not check CPU time, it makes comparison based on the internal robocode Ticks.
int numSkippedTurns = (currentExecutionTime - lastExecutionTime) - 1;
Robocode should call something to increase time (tic) inside of robot peer. If it does not do so for a bot, that bot will be punished. I still cannot find the part of the code where time++
logic is executed. These threads drive me nuts.
So, I like your proposal to time the bot inside its thread.
Hmm, there is still a problem with my idea, robocode will still kill the thread if it doesn't respond in time.
I see two different ways to combat this:
- Put a turnState enum with states {START, RUNNING, FINISHED} which can be polled to know if the bot thread is finished, combine this with timing in the bot thread, and then if it is finished we know it is not the bot causing the delay, so we don't kill the thread.
- Put some small sleeps every ~100 ticks to give the JVM time to perform optimizations and cleanup without interfering with the bot threads.
These could be combined, since they attack the problem from different sides.