2 zkzk7410 zkzk7410 于 2017.04.21 19:23 提问

★初学求指点★JAVA线程读取的顺序是什么?

public class Mythread1 implements Runnable {

@Override
public void run() {
    System.out.println("子线程开始执行");
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println("子线程执行完毕");

}

public class Mythead2 {

/**
 * @param args
 */
public static void main(String[] args) {

    System.out.println("创建线程");
    Thread td=new Thread(new Mythread1());
    td.start();
    System.out.println("执行完毕");
}

多次执行,系统输出一直是下面的结果:
创建线程
执行完毕
子线程开始执行
子线程执行完毕

疑问:这个怎么没有按照顺序来执行呀,即便main线程和子线程相互抢资源的话,子线程也有可能在“执行完毕”前显示
比如:
创建线程
子线程开始执行
子线程执行完毕
执行完毕

小弟初学,请大侠指点。谢谢

3个回答

weixin_38388710
weixin_38388710   2017.04.21 20:16

线程是有优先级的,而且你的线程还睡了一会,执行顺序,主线程先执行然后创建其他线程并开启,然后其他线程跟主线程抢控制权,如果其他线程抢到控制权则执行run方法中的业务(这里为线程休眠1000毫秒,因此主线程又获得控制权,主线程执行其他业务,导致上面的结果),否则主线程继续往下执行。手打不易不喜勿喷。

zkzk7410
zkzk7410 这个休眠1000毫秒,我感觉顺序应该是 :“创建线程”--“子线程开始执行”-这个时候就休息1秒,此时main线程和子线程抢资源,有可能先“子线程开始执行”,然后“执行完毕”,也有可能相反。不知道这样理解对不
7 个月之前 回复
zkzk7410
zkzk7410 这个休眠1000毫秒,我感觉顺序应该是 :“创建线程”--
7 个月之前 回复
zkzk7410
zkzk7410 这个休眠1000毫秒,我感觉顺序应该是 :“创建线程”--
7 个月之前 回复
oyljerry
oyljerry   Ds   Rxr 2017.04.21 19:47

这个只是凑齐,就是每次都是主线程先跑了。子线程后运行。这理论上不能依赖这个顺序关系。需要你自己控制执行顺序

zkzk7410
zkzk7410 加了join后就控制了顺序,哈哈
7 个月之前 回复
baij1230
baij1230   2017.04.21 21:16

有些前面两个大佬都提到了我就补充一点:如果线程被同步锁的话就会先执行被锁的线程

Csdn user default icon
上传中...
上传图片
插入图片