 <blockquote> <p>Is it safe if I use the same variable to create another subprocess if previous subprocess finishes?</p> </blockquote> <p>Yes. It would also be safe if the subprocess <em>weren't</em> finished, since you're completely replacing the value stored in <code>p</code> with a new value (a new object reference).</p> <hr> <p><s>In fact, <em>your</em> assignment in the loop you've shown isn't overwriting the previous value at all. By the time a new iteration starts, since you've declared your variable <em>inside</em> the block, it's either a new variable on each iteration or it's treated as though it were (you can look at it either way, probably; the bytecode probably reflects the latter but I think theory reflects the former). <em>Your</em> assignment is giving the (new) variable an initial value, not overwriting the previous iteration's value. If you moved your <code>Process p</code> declaration outside the loop, <em>then</em> you'd be overwriting it. Which would still be fine. :-)</s></p> <p>The strikeout text above may be or may not be true in theory (I'd have to dig through the JLS), but it would appear <em>not</em> to be true in pragmatic JVM/bytecode terms: Test: <a href="http://pastie.org/9422290" rel="nofollow">http://pastie.org/9422290</a> Bytecode: <a href="http://pastie.org/9422293" rel="nofollow">http://pastie.org/9422293</a> (pasted below). We can see that the <code>Date</code> reference is stored on instruction 20 of <code>main</code> in local variable 2 (<code>astore_2</code>). We only write to it on the first iteration. It isn't cleared when starting the next iteration, so pragmatically, you're using the same variable and overwriting it.</p> <p><code>Temp.java</code>:</p> <pre><code>import java.util.Date; public class Temp { public static final void main(String[] args) { int counter; for (counter = 0; counter &lt; 10; ++counter) { Date dt; if (counter &lt; 1) { dt = new Date(); System.out.println(dt); } System.out.println("loop end"); } } } </code></pre> <p>Output of <code>javap -c Temp</code>:</p> <pre><code>public class Temp { public Temp(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."&lt;init&gt;":()V 4: return public static final void main(java.lang.String[]); Code: 0: iconst_0 1: istore_1 2: iload_1 3: bipush 10 5: if_icmpge 42 8: iload_1 9: iconst_1 10: if_icmpge 28 13: new #2 // class java/util/Date 16: dup 17: invokespecial #3 // Method java/util/Date."&lt;init&gt;":()V 20: astore_2 21: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream; 24: aload_2 25: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V 28: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream; 31: ldc #6 // String loop end 33: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 36: iinc 1, 1 39: goto 2 42: return } </code></pre>