一:线程的定义,start和run的使用,main和thread的执行顺序

本文通过实例深入解析Java线程的start和run方法的区别,以及多个线程并发执行的顺序特点。线程start方法会创建新线程执行run,而直接调用run则在当前线程执行。在并发环境中,线程执行顺序是随机无序的,由CPU调度决定。
摘要由CSDN通过智能技术生成

线程的定义

        什么是线程,有很多种说法,我们简单的理解一下:线程就是在一个进程当中私有运行的一个子任务子单元。

1:先来了解一下线程的2个方法
1)start:用来开启一个新的线程并且执行run方法
2)run:不新起线程,直接在当前线程中执行Thread的run方法

我们通过2个例子来彻底弄懂一下:
实例1,查看start和run的区别:

package com.test.main;

public class Test {
    public static void main(String[] args) {
        int a = 10;
        System.out.println("Main-a:"+a);
        Thread thread = new Thread(new Runnable() {
            public void run() {
                System.out.println("执行Runnable1中打印线程名:"+Thread.currentThread().getName());
            }
        });
        thread.setName("自定义Thread");
        thread.start();

        Thread thread2 = new Thread(new Runnable() {
            public void run() {
                System.out.println("执行Runnable2中打印线程名:"+Thread.currentThread().getName());
            }
        });
        thread2.setName("自定义Thread2");
        thread2.run();

        System.out.println("执行Main中打印线程名:"+Thread.currentThread().getName());
    }
}
运行结果:
Main-a:10
执行Runnable2中打印线程名:main
执行Main中打印线程名:main
执行Runnable1中打印线程名:自定义Thread

说明:
1:start会新起一个线程,去私有的执行他的run方法
2new一个Thread直接执行run方法,他不会新起一个线程,他会在当前所在线程去执行这个new线程的Thread方法

看下面的例子来证明一下:

package com.test.main;

public class Test {

    static class MyThread extends Thread{

        public MyThread(String name){
            super(name);
        }

        public void run(){
            System.out.println("myThread打印线程名"+Thread.currentThread().getName());
        }
    }

    public static void main(String[] args) {
        int a = 10;
        System.out.println("Main-a:"+a);
        MyThread thread = new MyThread("myThread");
        thread.run();
        System.out.println("执行Main中打印线程名:"+Thread.currentThread().getName());
    }
}

调试过程如图:
在这里插入图片描述

实例2:main线程和Thread默认的执行顺序问题

package com.test.main;

public class Test {
    public static void main(String[] args) {
        int a = 10;
        System.out.println("Main-a:"+a);
        Thread thread = new Thread(new Runnable() {
            public void run() {
                for(int i = 0 ;i < 1000;i++){
                    System.out.println("第"+i+"次执行Runnable1中打印线程名:"+Thread.currentThread().getName());
                }
            }
        });
        thread.setName("自定义的Thread1");
        thread.setPriority(10);
        thread.start();

        Thread thread2 = new Thread(new Runnable() {
            public void run() {
                for(int i = 0 ;i < 1000;i++){
                    System.out.println("第"+i+"次执行Runnable2中打印线程名:"+Thread.currentThread().getName());
                }
            }
        });
        thread2.setName("自定义的Thread2");
        thread2.setPriority(10);
        thread2.start();

        for(int i = 0 ;i < 1000;i++){
            System.out.println("第"+i+"次执行Main中打印线程名:"+Thread.currentThread().getName());
        }
    }
}


运行结果:
看其中一段:
第314次执行Runnable2中打印线程名:自定义的Thread2
第580次执行Runnable1中打印线程名:自定义的Thread1
第687次执行Main中打印线程名:main
第581次执行Runnable1中打印线程名:自定义的Thread1
第315次执行Runnable2中打印线程名:自定义的Thread2
第582次执行Runnable1中打印线程名:自定义的Thread1
第688次执行Main中打印线程名:main
说明:这个程序有main线程,Thread1,Thread2,他们的执行先后顺序是随机无序的,cpu抢到哪个线程,就执行哪个。

看完,你明白了吗?
下一篇:线程状态流程解析

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值