java多线程System.out顺序

来源:互联网 发布:苹果怎么备份数据 编辑:程序博客网 时间:2024/06/04 18:58
Given:1. public class TestOne implements Runnable {2. public static void main (String[] args) throws Exception {3. Thread t = new Thread(new TestOne());4. t.start();5. System.out.print("Started");6. t.join();7. System.out.print("Complete");8. }9. public void run() {10. for (int i= 0; i< 4; i++) {11. System.out.print(i);12. }13. }14. }What can be a result?A. Compilation fails.B. An exception is thrown at runtime.C. The code executes and prints "StartedComplete".D. The code executes and prints "StartedComplete0123".E. The code executes and prints "Started0l23Complete".Answer: E
首先,你运行的main方法就是一个线程。然后,是你自己又启动了一个线程,这个线程里面你输出了0123当你从main方法里面启动了t线程后,两个线程就是一起运行了,至于谁先输出谁后输出,你是不能控制的。属于cpu调度的问题。ls解释不错。给你说明的就是main也是个线程。并不是说main方法会等待所有开启的子线程结束,他会自己继续运行。其中join方法告诉main方法,你等t结束后你再继续运行
Started可以出现在数字之后,甚至穿插,但是答案这不是没有这些选项么。。也即,Started和数字输出是有一定随机性的,正如你所述,Started之前,线程就已经start了,因此上述几种情况皆可能0123肯定是顺序输出,但Started可以在0之前、或01之间、12之间、23之间、3之后任何时候输出,因在System.out.pririt("Started");这句之前,thread t已开始运行,Started和0、1、2、3的输出先后关系有随机性,这也是多线程运行的特征之一。就本题来说,不存在穿插输出的答案,这点可以略过,此其一其二,Thread类的join方法的作用是,等待该线程结束,换言之,在该线程结束前(本题中为t),join函数是不会返回的,因此可知,0123一定在Complete之前打印

0 0
原创粉丝点击