java多线程System.out顺序

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值