【多线程中主线程与子线程执行的顺序】

多线程中主线程与子线程执行的顺序

在我们刚刚接触多线程时,所练习的Demo可能会达不到我们期待的运行结果,这其实有两种可能:

第一,是巧合,CPU可能是一直执行完一个线程再去执行另一个线程。所以我们看到的结果一直是没有交替执行的。
解决办法是:把运行的次数放大,10次不行就100次,100次不行就1000次,1000次不行5000次,其实1000次的时候也就差不多出现了交替运行。
//线程任务类

//线程任务类
public class ThreadDemo implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName()+"--"+i);
        }
    }
}

//测试类
public class Test {
    public static void main(String[] args)  {
        Thread th1 = new Thread(new ThreadDemo());
        Thread th = new Thread(new ThreadDemo());
        th.start();
        th1.start();
        for (int i = 0; i < 5; i++) {
            System.out.println("主线程:"+i);
        }
        System.out.println("线程--------------------------------------------------");
    }
}

如下的运行结果就不是理想状态的
多线程顺序

当我们把线程任务类的循环次数变为10,把测试类的循环变为100,此时的运行结果如下图:
多线程顺序

我们看到,三个线程轮流抢占CPU的执行权。这就是我们预测的结果,也是多线程下的理想状态。

第二,是你的程序有问题,比如以下的代码:
//线程任务类

//线程任务类
public class ThreadDemo implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"--"+i);
        }
    }
}

//测试类
public class Test {
    public static void main(String[] args)  {
        for (int i = 0; i < 100; i++) {
            System.out.println("主线程:"+i);
        }
        System.out.println("线程--------------------------------------------------");
        Thread th1 = new Thread(new ThreadDemo());
        Thread th = new Thread(new ThreadDemo());
        th.start();
        th1.start();
    }
}

先看运行结果:
多线程顺序

从结果中可以看到只有Thread-0和Thread-1线程在交替执行,而主线程是直接运行完毕的,并且是先执行完主线程再执行剩下的两个线程。其实不管我们运行多少次,结果也都是先把主线程执行完再去执行Thread-0和Thread-1线程。
原因:首先,我们必须知道,如果有多个线程在排队,那么CPU的执行权是随机抢占的。所以前提是必须有多个线程。但是无论哪个线程抢占到CPU的执行权,在线程中都是自上而下执行代码。问题就出在这。

刚开始时,只有主线程在使用CPU的执行权,因为其他两个线程还没有被创建,这时主线程的代码就自上而下的去执行。
当主线程的内容执行完毕后,就开始创建并启动其他的线程,此时,栈中有三个线程:主线程、Thread-0和Thread-1线程。但是主线程已经没有了要执行的代码,所以现在相当于只有Thread-0和Thread-1线程在执行,因此我们会看到这两个线程在轮流抢占CPU的执行权来输出他们各自的内容。
解决办法:
把主线程的内容放到子线程启动之后去执行,就会出现三个线程轮流抢占CPU执行权的情况。
代码更改:

public class Test {
    public static void main(String[] args)  {

        Thread th1 = new Thread(new ThreadDemo());
        Thread th = new Thread(new ThreadDemo());
        th.start();
        th1.start();

        for (int i = 0; i < 100; i++) {
            System.out.println("主线程:"+i);
        }
        System.out.println("线程--------------------------------------------------");
    }
}

结果如下图:
多线程顺序

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程和子线程池的区别在于它们所管理的线程的不同。线程池是指由线程创建和管理的线程池,而子线程池是指由子线程创建和管理的线程池。 线程池通常是在应用程序启动时创建的,用于管理整个应用程序的线程。它可以创建并管理多个子线程,用于执行一些耗时的任务,如网络请求、文件读写等。线程池通常是应用程序的核心部分,负责处理用户的输入和显示界面等操作。 子线程池是在线程池中创建的,用于执行一些辅助任务或者并行处理一些任务。子线程池通常是在需要执行大量任务时创建的,它可以创建和管理多个子线程,每个子线程都可以独立执行任务。子线程池可以提高应用程序的性能和响应速度,减少线程的负担。 总之,线程和子线程池的区别在于它们所管理的线程的不同,线程池用于管理整个应用程序的线程,而子线程池用于执行一些辅助任务或者并行处理任务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [ThreadPool线程池使用及解决线程和子线程执行顺序问题](https://blog.csdn.net/weixin_39794805/article/details/83684962)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料](https://download.csdn.net/download/jihaichen/10476184)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值