What is the difference of putting job on hold and putting it on ice?
There are two notable differences between ON HOLD and ON ICE jobs, which dictate when to use them. When an ON_HOLD job is put off hold, it runs, if it's starting conditions are satisfied, while an ON ICE job will not run, after putting into OFF ICE, even if it's starting conditions are met. It will only run, when it's starting condition will reoccur. For example, if you have a job which starts your Java services at 3.00 A.M., which was ON_HOLD, it will run as soon as you make OFF_HOLD and starting condition met, while in the case of ON ICE, it will only run on next day. Another critical difference between ON_ICE and ON_HOLD comes in terms of dependent jobs. All dependent jobs of an ON_ICE job will execute as though ON_ICE job was succeeded while all dependent jobs of an ON_HOLD job will not run until that job is put on OFF hold. This is the most important difference between them. In the case of box jobs, suppose you have 4 jobs inside a box jobs, and 3rd job depends upon the success of the 2nd job, which was put ON ICE, then when that box job is started, both first job and the 3rd job will start immediately because ON ICE makes the dependent job to run immediately.
Summary:
1 Dependent jobs of ON_HOLD doesn't run, but dependent jobs of ON_ICE runs as it succeeded.
2 An ON_ICE job doesn't run, when it puts OFF ICE and starting condition met while ON_HOLD jobs run when you put it OFF HOLD and it's starting conditions met (you can change its state to INACTIVE if this is undesirable).
3 Dependent jobs of ON_ICE jobs, which is inside a box job, will run immediately once box job is started.
(source)