please don't use Thread.sleep()