1206
2016-10-27 02:16:31
0
I/O 시에 쓰레드가 블록되는 특성 때문입니다.
2번 출력문만 사용하면 for 문 안에서 I/O가 일어나지 않기 때문에 아주 빠르게 처리할 수 있는 간단한 작업 밖에 없어서, 첫 번째 쓰레드의 러닝 중에 거의 다 처리되어 버립니다. 두 번째 쓰레드는 처음 test 메소드를 호출할 때 블록 상태로 들어갔다가 다시 나와서 처리하려고 보니 이미 첫 번째 쓰레드가 일을 다 해버려서 한번만 수행하고 말거나, 몇 번 수행 못해보고 끝나게 되는 겁니다.
반대로 for 문 안에서 I/O가 일어나도록 1번 출력문을 사용하면, 두 쓰레드 모두 for 문 1회 수행 시마다 반드시 블록 상태로 들어가기 때문에 공평하게 작업을 나눠 가지게 되는겁니다.