2-1-Java多线程-主线程的运行方式

主线程的运行方式

程序示例-1

代码

    class Demo {
        private   String name;

        public Demo(String name) {
            this.name = name;
        }

        public void show()
        {
            for (int i = 0 ; i < 10; i++)
            {
                System.out.println(name + i);
            }
        }
    }

    public class ThreadDemo {
        @Test
        public void single_thread() {
            Demo d1 = new Demo("AAA");
            Demo d2 = new Demo("BBB");
            d1.show();
            d2.show();
        }
    }

结果

    AAA0
    AAA1
    AAA2
    AAA3
    AAA4
    AAA5
    AAA6
    AAA7
    AAA8
    AAA9
    BBB0
    BBB1
    BBB2
    BBB3
    BBB4
    BBB5
    BBB6
    BBB7
    BBB8
    BBB9

分析

在之前的代码中,JVM启动后,必然有一个执行路径(线程)从main方法开始.一直执行到main方法结束这个线程在java中称之为主线程

graph LR
主线程-->show-20-AAA
show-20-AAA-->show-20-AAA
show-20-AAA-->show-20-BBB
show-20-BBB-->show-20-BBB

image

当主线程在这个程序中执行时,如果遇到了一定业务逻辑导致执行时间过长,无法执行下面的程序,可不可以实现一个主线程负责执行其中一个,由另一个线程负责其他代码的执行,实现多部分代码同时执行.

这就是多线程技术可以解决的问题.

如何创建线程

创建线程的两种方式:
一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。
1. 实现一个继承Thread的类
2. 重写run方法

    class PrimeThread extends Thread {
         long minPrime;
         PrimeThread(long minPrime) {
         this.minPrime = minPrime;
         }

         public void run() {
         // compute primes larger than minPrime
         . . .
         }
    }
  1. 创建子类对象,就是创建线程对象
 PrimeRun p = new PrimeRun(143);
 new Thread(p).start();
  1. 调用start方法,开启线程并让线程执行,同时还会调用JVM调用run方法

程序示例-2

class DemoMul1 extends Thread{
    private String name;

    public DemoMul1(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        show();
    }

    private void show()
    {
        for (int i = 0 ; i < 100; i++)
        {
            System.out.println(name + i);
        }
    }
}

    /**
     * 1. main进栈,创建两个线程对象
     * 2. AAA run进栈 20
     * 3. BBB run进栈 20
     * 4. 仍顺序执行
     * 只创建了两个线程对象,但是并未开启,仍然只有一条执行路径
      */
    public void mul_thread1(){
        DemoMul1 d1 = new DemoMul1("AAA");
        DemoMul1 d2 = new DemoMul1("BBB");
        d1.run();
        d2.run();
    }

结果


AAA0
AAA1
AAA2
AAA3
AAA4
AAA5
AAA6
AAA7
AAA8
AAA9
BBB0
BBB1
BBB2
BBB3
BBB4
BBB5
BBB6
BBB7
BBB8
BBB9

分析

  1. main进栈,创建两个线程对象
  2. AAA run进栈 20
  3. BBB run进栈 20
  4. 仍顺序执行
  5. 只创建了两个线程对象,但是并未开启,仍然只有一条执行路径

程序示例-3


class DemoMul1 extends Thread{
    private String name;

    public DemoMul1(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        show();
    }

    private void show()
    {
        for (int i = 0 ; i < 50; i++)
        {
            System.out.println(name + i);
        }
    }
}
    public void mul_thread2(){
        DemoMul1 d1 = new DemoMul1("AAA");
        DemoMul1 d2 = new DemoMul1("BBB");
        d2.start();//d2这个线程开启,多了一条执行路径
        d1.run();//由主线程执行
    }

结果

AAA0
BBB0
AAA1
BBB1
AAA2
AAA3
AAA4
AAA5
AAA6
BBB2
BBB3
BBB4
BBB5
BBB6
BBB7
BBB8
BBB9
BBB10
BBB11
BBB12
BBB13
BBB14
BBB15
BBB16
BBB17
BBB18
BBB19
BBB20
BBB21
BBB22
BBB23
BBB24
BBB25
BBB26
BBB27
BBB28
BBB29
BBB30
BBB31
BBB32
BBB33
BBB34
BBB35
BBB36
BBB37
BBB38
BBB39
BBB40
BBB41
BBB42
BBB43
BBB44
BBB45
BBB46
BBB47
BBB48
BBB49
AAA7
AAA8
AAA9
AAA10
AAA11
AAA12
AAA13
AAA14
AAA15
AAA16
AAA17
AAA18
AAA19
AAA20
AAA21
AAA22
AAA23
AAA24
AAA25
AAA26
AAA27
AAA28
AAA29
AAA30
AAA31
AAA32
AAA33
AAA34
AAA35
AAA36
AAA37
AAA38
AAA39
AAA40
AAA41
AAA42
AAA43
AAA44
AAA45
AAA46
AAA47
AAA48
AAA49

分析

graph LR 
主线程-->run-AAA-10次
run-AAA-10-->主线程结束
主线程-->run-BBB-10次
run-BBB-10-->d1线程结束
d1线程结束-->主线程结束

image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值