public class CreateThreadRunnableExample implements Runnable { public void run() { for (int i = 0; i < 5; i++) { System.out.println("Child Thread : " + i); try { Thread.sleep(50); } catch (InterruptedException ie) { System.out.println("Child thread interrupted! " + ie); } } System.out.println("Child thread finished!"); } public static void main(String[] args) { Thread t = new Thread(new CreateThreadRunnableExample(),"My Thread"); t.start(); for (int i = 0; i < 5; i++) { System.out.println("Main thread : " + i); try { Thread.sleep(100); } catch (InterruptedException ie) { System.out.println("Child thread interrupted! " + ie); } } System.out.println("Main thread finished!"); } }
在这个程序中,两种睡眠方式都使用了不同的时间..,所以如果主线程运行时间,那么子线程必须运行2次,但它只运行一次….我们采取可运行或运行的概念然后当主线程结束时,那么2个子线程将处于就绪状态,为什么只有一个子线程运行.
解决方法
public static void sleep(long millis)
throws InterruptedExceptionCauses the currently executing thread to sleep (temporarily cease execution) for the
specified number of milliseconds,subject to the precision and
accuracy of system timers and schedulers. The thread does not lose
ownership of any monitors.
所以基本上这些代码有时候可以像预期一样工作,而其他的时候不行.
另外,你似乎只有一个孩子,所以你为什么期待2?
编辑:从理论上说,当主线程睡着时,子线程应该执行两次.话虽如此,如JavaDoc所述,sleep方法执行的准确性取决于运行它的系统,有时候可能会让其按预期工作,而在其他时间不执行.因此,例如,您可能会遇到主线程睡眠的情况,97毫秒,而不是100,而孩子睡眠时间为53毫秒.这将导致小孩只执行一次.
另一个选择是做这样的事情:while(currentTime = = timeNeededToElapse){currentTime = …}.这导致一个紧张的循环,这可以提供更好的控制,但仍然是,据我所知,不是100%准确,更不要说,你将消耗cpu周期有效地做什么,所以谨慎使用.