java主线程无线循环判断为什么要sleep?

public class MainTest {

public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(5);

for(int i = 0; i < 100000; i++) {
threadPool.execute(new Command());
}

while(true) {
try {
Thread.sleep(10);
}
catch (InterruptedException e) {
e.printStackTrace();
}
if(Resource.getTotal() == 100000) {
threadPool.shutdown();
break;
}
}
}

}
主线程无线循环判断,当总数到达100000的时候,终止线程池,然后程序终止。为什么这里一定要加上sleep(10)?如果不加sleep(10),程序最后不会终止。这是为什么呢?

加睡眠是为了让出cpu,让其它线程能尽快执行
这个代码应该改成main线程在某个对象wait,而Command线程每算完一个看看是否Resource.getTotal() == 100000,如果是则对这个对象notify

如果是是jdk1.7可以考虑使用CountDownLatch类,latch = new CountDownLatch(100000),然后main线程latch.await(),每个Command线程结束前调用一下latch.countDown(),等100000个Command执行完成了main线程就会被唤醒继续执行
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-08
sleep(10)对用户没什么实质影响,但对JVM有影响,在sleep(10)这段时间线程休眠,可以走到if代码段判断条件再根据条件结束线程,如果没有sleep(10)这句,程序会一直在while内部循环,走不到if代码段追问

为什么没有sleep(10)这句,就不会走到if判断呢,if也在while循环体内部啊,按理说不应该跳过if啊??

第2个回答  2014-01-10
在单核机器上,不加sleep(10),主线程会一直占用cpu资源,其他线程无法运行
第3个回答  2014-01-10
依然会啊,加的原因致使为了放出一点时间 进行处理
第4个回答  2014-01-10
CPU满了,没有资源了
相似回答