In reply to KillSteal:
Another way of saying what is happening is the first fork only creates one process, which is the for loop statement. The second fork is inside the for loop, so each iteration forks another process.
The the reason the second loop only prints i=4 is because there is only one instance of the variable i shared by all the forked processes., and its value has reached 4 by the time each process calls the method(i). To fix that, you need to declare another variable that gets activated for each iteration of the loop.
task fork_2();
for ( int i= 0; i<4; i++)
fork
automatic int j = i;
method(j);
join_none;
endtask